<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CU8HR3oyeip7ImA9WxBbE0k.&quot;"><id>tag:blogger.com,1999:blog-22557003</id><updated>2010-03-11T23:43:56.492+02:00</updated><title>Graham says...</title><subtitle type="html">Articles by Graham Poulter</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.grahampoulter.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.grahampoulter.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/grahampoulter" /><feedburner:info uri="grahampoulter" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><feedburner:emailServiceId>grahampoulter</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CUAHSH0yfSp7ImA9WxBUFUg.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-561120836562891428</id><published>2010-03-02T20:14:00.001+02:00</published><updated>2010-03-02T20:15:39.395+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-02T20:15:39.395+02:00</app:edited><title>To Sleep Well: Stay offline in the late evening</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_rswIZalsPuc/S41UfleWEZI/AAAAAAAABRY/kfF5dO5d3F0/s1600-h/images.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_rswIZalsPuc/S41UfleWEZI/AAAAAAAABRY/kfF5dO5d3F0/s1600/images.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;My sleep cycle continually drifts later: a spiral of going to sleep later, waking up later, feeling worse, starting to crave coffee, staying at work later, coming home later, working later on the computer... going to sleep later.&lt;br /&gt;
&lt;br /&gt;
After I've been away hiking for a week, I come back and sleep well - because for a week I've been going to bed at sunset, waking up at sunrise and exercising the whole day.&amp;nbsp; But, once back at work, the cycle begins again.&lt;br /&gt;
&lt;br /&gt;
I think a major cause of the late bed-times and insomnia is using the computer in the evening: email, IM, browsing - damn you digg and reddit - and my pet projects, tasks and goals that I work on after-hours, often till after 11pm.&amp;nbsp; And even if I'm off by 10pm, I simply cannot fall asleep diving from the computer onto the bed - even reading a few chapters of a book first.&amp;nbsp; Sometimes falling asleep takes hours.&amp;nbsp; I sometimes go out with friends during the week, but then I usually fall asleep quickly.&lt;br /&gt;
&lt;br /&gt;
So, my new idea is to&amp;nbsp; do all my home computer tasks early in the evening as the first thing when I get home from work.&amp;nbsp; Once I'm tired, around 8pm, I'll shut it down, shower, have dinner, and spend the rest of the evening relaxing - TV, dead-tree books, and scribbling notes on paper, and go to bed as soon as I'm relaxed and bored.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-561120836562891428?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/PpkRq2q7fXE" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2010/03/to-sleep-well-stay-offline-in-late.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/561120836562891428?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/561120836562891428?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/PpkRq2q7fXE/to-sleep-well-stay-offline-in-late.html" title="To Sleep Well: Stay offline in the late evening" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_rswIZalsPuc/S41UfleWEZI/AAAAAAAABRY/kfF5dO5d3F0/s72-c/images.jpeg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2010/03/to-sleep-well-stay-offline-in-late.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YCQH08eyp7ImA9WxNVGUo.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-9206162008656973091</id><published>2009-10-30T22:42:00.008+02:00</published><updated>2009-10-31T08:39:21.373+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-31T08:39:21.373+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>Google Maps South Africa launches new features for 2010</title><content type="html">Today &lt;a href="http://www.linkedin.com/in/jarda"&gt;Jaroslav Bengl&lt;/a&gt;, the Business Product Manager for Google Switzerland GmbH, presented a developer overview of Google Maps features released in South Africa just yesterday.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin: 0px;"&gt;
As of yesterday, the &lt;a href="http://maps.google.co.za/"&gt;South African Google Maps&lt;/a&gt; has &lt;a href="http://maps.google.co.za/maps?saddr=Cape+Town,+South+Africa&amp;amp;daddr=George,+South+Africa"&gt;driving directions&lt;/a&gt;, reverse geocoding ("what is near this coordinate"), and overlays for terrain elevation, photos, Wikipedia, Panoramio, and public transit routes. &lt;a href="http://en.wikipedia.org/wiki/Google_Street_View"&gt;Google Street View&lt;/a&gt; cars are surveying Johannesburg, Cape Town, Durban, Pretoria and East London - and the street view should be ready before the World Cup. &lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin: 0px;"&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin: 0px;"&gt;
Here is a view of the Koeberg Interchange which now has directional arrows used by the route finders:&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin: 0px;"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_rswIZalsPuc/SutEAdEEm3I/AAAAAAAABKg/3kVuas2PGzk/s1600-h/staticmap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_rswIZalsPuc/SutEAdEEm3I/AAAAAAAABKg/3kVuas2PGzk/s320/staticmap.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin: 0px;"&gt;
&lt;div style="margin: 0px;"&gt;
All the effort is indeed in preparation for the World Cup, for the sake of all the tourists who have become accustomed to driving directions and complete road networks in the Google Maps of their own countries. Jaroslav says South Africa is getting driving directions and street view ahead of even some European countries and cities.&lt;br /&gt;
&lt;br /&gt;
Google no doubt is paying a lot of license money for access to complete and up-to-date road network data, and we have the Fifa 2010 World Cup to thank for pushing us up the list of priorities. &amp;nbsp;However, for the last few years as a Google Maps backwater, there were some people working to fill in the SA road networks and directions, namely the GPS-equipped volunteers at &lt;a href="http://www.openstreetmap.org/"&gt;OpenStreetMap&lt;/a&gt;, who even took the trouble to mark on OpenStreetMap the changes to the Koeberg Interchange that are under construction:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_rswIZalsPuc/SutFIR25hzI/AAAAAAAABKo/ehaLZAtrxBg/s1600-h/map.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_rswIZalsPuc/SutFIR25hzI/AAAAAAAABKo/ehaLZAtrxBg/s320/map.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
On the &lt;a href="http://code.google.com/apis/maps/documentation/demogallery.html"&gt;Google Maps API&lt;/a&gt; side of things, the &lt;a href="http://code.google.com/apis/maps/documentation/examples/geocoding-simple.html"&gt;geocoding API&lt;/a&gt; (address-&amp;gt;latitude/longitude) is now also available in South Africa, and the search box supports mixed languages: searching for "&lt;a href="http://maps.google.co.za/maps?q=cape+town+%E3%82%B7%E3%83%A7%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0"&gt;cape town ショッピング&lt;/a&gt;" where the second word is Japanese for "shopping" works as expected.  However, "&lt;a href="http://maps.google.co.za/maps?q=%EB%A0%88%EC%8A%A4%ED%86%A0%EB%9E%91+cape+town"&gt;레스토랑 cape town&lt;/a&gt;" where the first word is Korean for "restaurant" brings up hotels instead. &amp;nbsp; There are many APIs for &lt;a href="http://code.google.com/apis/maps/documentation/examples/geoxml-kml.html"&gt;overlaying your own data &lt;/a&gt;on Google Maps, for example using a public KML feed. The &lt;a href="http://maps.google.com/help/terms_maps.html"&gt;terms of service&lt;/a&gt; require in any case that apps using the free Google Maps API themselves be free and open to the public.&lt;br /&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/22557003-9206162008656973091?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/UHyh7IeTW-w" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/10/google-maps-south-africa-launches-new.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/9206162008656973091?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/9206162008656973091?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/UHyh7IeTW-w/google-maps-south-africa-launches-new.html" title="Google Maps South Africa launches new features for 2010" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_rswIZalsPuc/SutEAdEEm3I/AAAAAAAABKg/3kVuas2PGzk/s72-c/staticmap.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/10/google-maps-south-africa-launches-new.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4ARXw8eSp7ImA9WxNVGU4.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-8572955450956837785</id><published>2009-10-29T10:45:00.001+02:00</published><updated>2009-10-30T23:25:44.271+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-30T23:25:44.271+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><title>The South African User Experience Forum</title><content type="html">The South African User Experience Forum
("SA UX Forum") is a community of practice in the field of user
experience design.&lt;br /&gt;
&lt;br /&gt;
I went to a SA UX Forum event last night at 24.com, organised by &lt;a href="http://www.google.com/profiles/philbuk"&gt;Phil Barrett&lt;/a&gt;&amp;nbsp; of Flow Interactive and
hosted by 20Four Labs, with wine from Stormhoek.  About 50 people
attended, mostly designers and architects, and a handful of developers
like myself.&lt;br /&gt;
&lt;br /&gt;
Phil Barrett spoke about innovation and sketching (especially how
sketched interfaces can be iterated and refactored with the users'
participation, infinitely faster than software iterations), Kath
Roderick from Microsoft gave a demo of Sketchflow (part of Expression
Blend), and Dennis Williams from DNA|Creative spoke about the basics of
how to sketch - including what pens to use (about 5 different pens) and
"how to draw stuff" for people who can't draw.  They also demo'd
&lt;a href="http://www.balsamiq.com/products/mockups"&gt;Balsamiq Mockups&lt;/a&gt;  a lo-fi
sketching software for Adobe Air.  &lt;br /&gt;
&lt;br /&gt;
I thoroughly enjoyed it, even though by "interface" I usually think of
an Application Progamming Interface. If you're interested, they announce
events via a &lt;a href="http://groups.google.com/group/sa-ux-forum"&gt;Google Group&lt;/a&gt; and &lt;a href="http://www.facebook.com/group.php?gid=2750787123"&gt;Facebook&lt;/a&gt;.&amp;nbsp; Here's a &lt;a href="http://groups.google.com/group/sa-ux-forum/web/sa-ux-meetup---cape-town%20"&gt;list of their previous meet-ups&lt;/a&gt;
and &lt;a href="http://groups.google.com/group/sa-ux-forum/web/ux-resources%20"&gt;other user experience resources&lt;/a&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-8572955450956837785?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/SsEmvx2W9lg" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/10/south-african-user-experience-forum.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/8572955450956837785?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/8572955450956837785?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/SsEmvx2W9lg/south-african-user-experience-forum.html" title="The South African User Experience Forum" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/10/south-african-user-experience-forum.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMBSXY9fip7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-5491905944497484672</id><published>2009-10-18T20:01:00.002+02:00</published><updated>2009-10-19T10:54:18.866+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:54:18.866+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fail" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>The 2004 Fiesta and the loose plastic door bits</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
These are black plastic strips on the outside between the front and back door of the 2004 Ford Fiesta.  What happens is they are glued on, and the glue is of the cheap sort that loses its adhesion over time and in the elements.&lt;br /&gt;&lt;br /&gt;Twice, a plastic strip has come loose and vibrate at high speed, threatening to fall off. I have personally glued the strips back down with contact adhesive and test them from time to time to check if they are coming loose again.&lt;br /&gt;&lt;br /&gt;It is a consistent manufacturing defect: the wrong choice of glue, and a design defect by not securing the strips properly.&lt;br /&gt;&lt;br /&gt;Also, the plastic grills on the left and right of the Fiesta bumper come out easily when pressed and could easily come off if bumped.&lt;br /&gt;&lt;br /&gt;All plastic trimmings cost a lot - R100 for radiator caps, R400 for plastic grill-bit for a bumper, probably R300-400 for the plastic bit for the door.&lt;br /&gt;&lt;br /&gt;IOL article about it: &lt;a href="http://www.iol.co.za/index.php?click_id=3027"&gt;http://www.iol.co.za/index.&lt;wbr&gt;&lt;/wbr&gt;php?click_id=3027&lt;/a&gt;&lt;br /&gt;
in reference to: &lt;br /&gt;
&lt;blockquote&gt;
"FMCSA"&lt;br /&gt;
- &lt;a href="http://www.iol.co.za/index.php?click_id=3027"&gt;IOL: Wendy Knowler's Consumer Alert&lt;/a&gt; (&lt;a href="http://www.google.com/sidewiki/entry/graham.poulter/id/usvMwt-utPkKi7nxl0DVgwtxmZQ"&gt;view on Google Sidewiki&lt;/a&gt;)&lt;br /&gt;
&lt;/blockquote&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-5491905944497484672?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/kIKRGCtQgCI" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/10/2004-fiesta-and-loose-plastic-door-bits.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/5491905944497484672?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/5491905944497484672?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/kIKRGCtQgCI/2004-fiesta-and-loose-plastic-door-bits.html" title="The 2004 Fiesta and the loose plastic door bits" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/10/2004-fiesta-and-loose-plastic-door-bits.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUBQnk6eip7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-7398677038908110389</id><published>2009-10-11T16:10:00.003+02:00</published><updated>2009-10-19T10:50:53.712+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:50:53.712+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><title>Getting new habits to stick</title><content type="html">I was reading &lt;a href="http://zenhabits.net/2007/09/engineer-life-set-up-habit-changes-so-its-hard-to-fail/"&gt;Engineer Life: Set Up Habit Changes So It’s Hard to Fail&lt;/a&gt;,&amp;nbsp; which advocates applying &lt;a href="http://en.wikipedia.org/wiki/Reinforcement"&gt;reinforcement&lt;/a&gt;
or "feedback" from all angles: with positive and
negative reinforcement to the desired behaviour or habit&amp;nbsp; and alternative undesired behaviours - old habits or
not bothering with the new habit - until repetition makes the new habit into a well-worn path.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Here are the mentioned sources of reinforcement and the directions of reinforcement stated with parallel constructions - because it looks neat to see the same thing from four different perspectives.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Some sources of reinforcement&lt;/b&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Social reinforcement: via friends, clubs, classes, forums, coaching. Positive from encouragement and congratulations, negative from discouragement and chastisement.&lt;/li&gt;
&lt;li&gt;Self-reinforcement: positive from congratulating yourself and celebrating small successes. &amp;nbsp;Negative... usually works against you.&lt;/li&gt;
&lt;li&gt;Convenience: positive from making the behaviour convenient, negative from making it inconvenient. For example, being near to a gym vs far away.&lt;/li&gt;
&lt;li&gt;Satisfaction: positive from making the behaviour more pleasant, negative from making it more unpleasant. &amp;nbsp;Get a bad screen to reduce time spent on the computer?&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Make it&amp;nbsp;easy to carry out the new behaviour&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Strengthen positive reinforcements for the new behaviour by adding positive social feedback, positive self-feedback, and making it more pleasant and more convenient.&lt;br /&gt;
&lt;br /&gt;
Weaken negative reinforcements for the new behaviour by removing negative social feedback, negative self-feedback, and making it less unpleasant and less inconvenient.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Make it difficult not to carry out the new behaviour&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Weaken positive reinforcements for alternate behaviours by removing positive social and self-feedback, and making them less pleasant and less convenient.&lt;br /&gt;
&lt;br /&gt;
Strengthen negative reinforcements for alternate behaviours by adding adding negative social and self-feedback, and making them more unpleasant and more inconvenient.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-7398677038908110389?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/ozVz8GQFk3M" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/10/changing-behaviour-through.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7398677038908110389?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7398677038908110389?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/ozVz8GQFk3M/changing-behaviour-through.html" title="Getting new habits to stick" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><georss:point>-33.9237762 18.4233455</georss:point><feedburner:origLink>http://blog.grahampoulter.com/2009/10/changing-behaviour-through.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAHRHY4eyp7ImA9WxNVGU4.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-7378397249942856356</id><published>2009-09-28T10:49:00.003+02:00</published><updated>2009-10-30T23:05:35.833+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-30T23:05:35.833+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>Google Sidewiki</title><content type="html">Web-wide comment toolbars aren't new, although the web-scribblers I've tried before were barely social, never mind wiki-like.&lt;br /&gt;
&lt;br /&gt;
But, Google as usual comes in with the simplest (to the user) implementation: &lt;a href="http://www.google.com/sidewiki/intl/en/index.html"&gt;SideWiki&lt;/a&gt; (&lt;a href="http://googleblog.blogspot.com/2009/09/help-and-learn-from-others-as-you.html"&gt;official blog post&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
If you are the verified owner of a site in Google Webmaster Tools,  Sidewiki lets you "Write as the site owner", pinning your messages to the top.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.businessweek.com/technology/content/sep2009/tc20090924_466096.htm"&gt;There's some worries&lt;/a&gt; around about sidewiki "stealing" blog comments or fracturing the conversation around a page: but much same goes for Facebook, Twitter, Digg, Reddit, Friendfeed, etc.   Facebook et al even add headers to shared links so that comments can go to facebook rather than the website.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-7378397249942856356?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/g-P4D76rO4A" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/09/google-sidewiki.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7378397249942856356?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7378397249942856356?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/g-P4D76rO4A/google-sidewiki.html" title="Google Sidewiki" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/09/google-sidewiki.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMMR349fSp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-2671385839346888280</id><published>2009-09-10T16:33:00.006+02:00</published><updated>2009-10-19T10:54:46.065+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:54:46.065+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>A notation for nested data structures in Python</title><content type="html">The &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; programming language makes it easy to compose collections into nested hierachies, built up from lists, dictionaries, tuples and objects with generated attributes.  One can put together a dictionary that maps a pairs of strings to lists of objects whose "calls" attribute is a dictionary mapping ints to pairs of dates and whose "topics" attribute is a list of integers.

If for some reason such a nested data structure is actually returned by a function (e.g. to fill a complex report template), anyone using it will also need to understand what it holds.  So, I've been refining a notation that I use in docstrings to concisely express the structure a composition of collections.  Here it is by example:

&lt;ul&gt;&lt;li&gt;List of strings:&lt;span style="font-family:courier new;"&gt; [name]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Set of strings: &lt;span style="font-family:courier new;"&gt;{name}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Pair of string and int:&lt;span style="font-family:courier new;"&gt;  (name, age)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;List of tuples: &lt;span style="font-family:courier new;"&gt;[(name, age)]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Dictionary from strings to dates:  &lt;span style="font-family:courier new;"&gt;{firstname: birthdate}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Object with dynamic attributes:&lt;span style="font-family:courier new;"&gt; .name .age .phones=[phone]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Putting it all together: &lt;span style="font-family:courier new;"&gt;{(country,city): [.name .phones=[phone]]}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Example from the intro:  &lt;span style="font-family:courier new;"&gt;{(name1,name2): .calls={phone:(start,finish)}, .topics=[topicid]}&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
The notation as it stands describes the semantics of a collection or composition of nested collections and not the types of the collected objects, but it could be extended to do so, for example &lt;span style="font-family:courier new;"&gt;{firstname&amp;lt;string&amp;gt;:birthdate&amp;lt;date&amp;gt;}&lt;/span&gt;, although the types are redundant in that case.

In languages which lack convenient collection types, one would typically define classes for everything named above.  There would be an &lt;span style="font-style: italic;"&gt;Address&lt;/span&gt; class having "country" and "city" fields, a &lt;i&gt;Person&lt;/i&gt; class having "name" and "age" and "phones" fields and a &lt;i&gt;PersonPair&lt;/i&gt; having "name1" and "name2" fields and a &lt;i&gt;DateRange&lt;/i&gt; having "start" and "finish"... which is fine if a lot of code relies on &lt;i&gt;PersonPair&lt;/i&gt; objects and makes the structures explicit, but is annoying for throwing together ad-hoc collections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-2671385839346888280?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/uXRWP2nl7wg" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/09/notation-for-nested-data-structures-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/2671385839346888280?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/2671385839346888280?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/uXRWP2nl7wg/notation-for-nested-data-structures-in.html" title="A notation for nested data structures in Python" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/09/notation-for-nested-data-structures-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IEQXY_eip7ImA9WxJaFUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-7700716545728841598</id><published>2009-08-06T10:57:00.005+02:00</published><updated>2009-08-06T11:05:00.842+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-06T11:05:00.842+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><title>Safari on Mac caching is broken for web hosts having CNAMEs</title><content type="html">It took a day to figure it out.  We have an internal website which loads perfectly in all browsers, except for the people using Safari, where Safari insisted on re-loading all the static dependencies of a page, and took 30 seconds to do so.   Instead of taking .1 seconds (Firefox on Linux, caching all dependencies), or 4 seconds (hard page refresh in Firefox), Safari would take 18-30 seconds to load a page - making the site unusable.

Later, we found that it was just Safari &lt;i&gt;on Mac&lt;/i&gt;:  Safari on Windows behaves just like Firefox and IE with respect to caching.

The plot thickened further when I telnetted to port 80 on the server to check for proxies in the way: according to telnet the server had a different name.   I did a host lookup and found that the server was a CNAME pointing to another name, which had the actual record.  For example, blog.grahampoulter.com is a CNAME pointing to ghs.google.com which actually hosts this blog.   On a hunch, I requested an A record to make the server name resolve directly to the IP address instead of looking up another record first.   Lo and behold, Safari 4 on Mac started caching the pages properly.

So, I broke Safari - on Mac Safari #fails to cache pages loaded from a server whose DNS is a CNAME pointer instead of an A record.  A &lt;span style="font-style: italic;"&gt;lot&lt;/span&gt; of web servers have CNAMEs pointing at them, and if every time a Safari-on-Mac browser visits one it reloads all the page dependencies, that's a lot of loading.

Now, would someone who actually uses a Mac please confirm and file a bug report for me?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-7700716545728841598?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/40hSP9sb9Z0" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/08/mac-safari-caching-bug-for-cname-hosts.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7700716545728841598?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7700716545728841598?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/40hSP9sb9Z0/mac-safari-caching-bug-for-cname-hosts.html" title="Safari on Mac caching is broken for web hosts having CNAMEs" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/08/mac-safari-caching-bug-for-cname-hosts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYGQ3s6cCp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-4266423739960815859</id><published>2009-07-11T00:30:00.001+02:00</published><updated>2009-10-19T10:48:42.518+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:48:42.518+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><title>Backing up and synchronising data</title><content type="html">In which I relate my past and present strategies for backing up and synchronising data small and large.

Starting in 1997 I've gone through through many backup strategies and backup media, beginning with a pile of 1.44MB floppies, moving on to CD-RWs, and DVD-RWs, then to mirroring between various machines using a combination of &lt;a href="http://www.samba.org/rsync/"&gt;rsync&lt;/a&gt; (fast one-way sync) and &lt;a href="http://www.cis.upenn.edu/%7Ebcpierce/unison/"&gt;Unison&lt;/a&gt; (slower two-way sync).  Mirroring also lets me have the data available at the machines where I need it, while DVD's and are too small to be worth the time to write them.

The simple part is managing my small "working set" of about 300MB of code and documents: my flash drive goes everywhere, and the first and last thing I do when using a machine is run &lt;a href="http://www.cis.upenn.edu/%7Ebcpierce/unison/"&gt;Unison&lt;/a&gt; to synchronise between the machine's home folder and the flash drive.  Unison is speedy on Linux, although much slower than rsync with large folders, but is slow on Windows where it is better to sync just the subset that you need on that machine.  With this being South Africa where internet access is neither guaranteed nor fast, I won't be trading my flash drive in for a &lt;a href="https://www.getdropbox.com/home"&gt;DropBox&lt;/a&gt; either.


But the disk-sized data became complex:  archived documents, books and PDFs, photos, music, videos.  The reason was a proliferation of machines that I used, and a poor choice of naming scheme with each computer keeping a folders likes "mirror/HomeLaptop" folder that would mirror a  subset of data "owned" by HomeLaptop.  The more partitions and hosts (home laptop, home desktop, lab or office desktop, external drive, and so forth) the more rsync scripts to maintain.  And, while I could read the mirrored data, using one-way sync meant I  could only make changes to the data on the "owner" machine.

With setting up my new desktop, I've moved to a naming scheme which uses a shared namespace across all machines, and uses Unison and the &lt;a href="http://www.opbyte.it/grsync/"&gt;Grsync&lt;/a&gt; GUI to make them become eventually consistent over time, although no machine has all of the data in the name space.  The top-level "libraries" are &lt;i&gt;Code&lt;/i&gt;, &lt;i&gt;Documents&lt;/i&gt;, &lt;i&gt;Pictures&lt;/i&gt;, &lt;i&gt;Music&lt;/i&gt;, &lt;i&gt;Software&lt;/i&gt;, and &lt;i&gt;Video&lt;/i&gt;.   Documents contains the second-level folders &lt;i&gt;Home&lt;/i&gt;,&lt;i&gt; Office, Archives &lt;/i&gt;and &lt;i&gt;Books&lt;/i&gt;: &lt;i&gt;Home&lt;/i&gt; and &lt;i&gt;Office&lt;/i&gt; are synced by unison to the flash drive to keep them always-consistent.  However, &lt;i&gt;"Software/LinuxDesktop"&lt;/i&gt; may diverge over time between the  Home and Office desktops, and become consistent later thanks to unison and grsync and a travelling drive.  The strategy will evolve over time.

Other people have different solutions.  Using only &lt;i&gt;one&lt;/i&gt; computer (backup to an external drive) is a common one.  People with multiple machines at home might mimic an office environment by having a central always-on network share (even a dedicated NAS device) where everything resides and is backed up en-mass.   My machines are 3 x home (1 laptop and a dual-boot desktop) and office, plus a flash disk and a disk drive in-between.  So I've gone with a distributed approach where I only use local storage, and get "backups" as a side-effect the drives being synchronised occasionally.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-4266423739960815859?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/RmXGQRwGiR4" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/07/backing-up-and-synchronising-data.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/4266423739960815859?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/4266423739960815859?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/RmXGQRwGiR4/backing-up-and-synchronising-data.html" title="Backing up and synchronising data" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/07/backing-up-and-synchronising-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcNSX0_fSp7ImA9WxJVEk0.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-8483778990474294761</id><published>2009-06-28T17:31:00.000+02:00</published><updated>2009-06-28T17:31:38.345+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-28T17:31:38.345+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><title>One approach to booting Linux, XP and Windows 7</title><content type="html">So this is my configuration. I like to keep around a toy Windows OS for iTunes (for iPhone jailbreak) and games.&amp;nbsp; These are all primary partitions:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Drive 1:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt; Partition 1 (35GB): Windows XP &lt;/li&gt;
&lt;li&gt;Partition 2 (55GB): Windows 7 RC (shiny toy)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Partition 3 (rest): Linux data (/home - the serious stuff)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Drive 2:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Partition 1 (30GB): Ubuntu Linux 9.04&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Partition 2 (15GB): (to test other distros on the hardware)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Partition 3 (2GB): Linux swap&lt;/li&gt;
&lt;li&gt;Partition 4 (rest): Windows data (C:\User - games &amp;amp; media)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
The things I figured out to make it work: &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Do all partitioning before installing Windows, and only use Linux to edit partitions (cfdisk or gparted).&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;The Windows 7 partition manager confuses XP because Windows 7 changes from "cylinder aligned" to "megabyte aligned" partitions.&amp;nbsp; However, both can understand what Linux writes.&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;For Windows XP to complete installing, you have to install it before installing Windows 7.&amp;nbsp; &lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Let Windows 7 have the MBR on Drive1, which gives options to boot Windows 7 or XP.&amp;nbsp; Install the GRUB MBR on Drive 2, and set the BIOS to boot Drive 2 first so that GRUB runs by default.&amp;nbsp; I figure keeping the bootloader could be handy.&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Or: use GRUB only and overwrite the Windows 7 MBR with GRUB&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Or: install &lt;a href="http://neosmart.net/wiki/display/EBCD/NeoGrub"&gt;NeoGRUB&lt;/a&gt; on Windows 7 and add a chainloader for the Linux partition&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Putting the data on the opposite drive from its host OS is to avoid user disk operations slowing the running OS.&amp;nbsp; However, the drives are not independent - you don't have "windows drive" and a "linux drive".&lt;/li&gt;
&lt;/ol&gt;
Hope someone finds it useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-8483778990474294761?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/U_DQaYOFXAE" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/06/one-approach-to-booting-linux-xp-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/8483778990474294761?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/8483778990474294761?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/U_DQaYOFXAE/one-approach-to-booting-linux-xp-and.html" title="One approach to booting Linux, XP and Windows 7" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/06/one-approach-to-booting-linux-xp-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQERHs7cSp7ImA9WxNWGUg.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-3118075027921016917</id><published>2009-06-13T14:58:00.014+02:00</published><updated>2009-10-19T15:18:25.509+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T15:18:25.509+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><title>How to select parts for a custom computer</title><content type="html">Advancing software has gradually brought my 2004 Dell D600 laptop to a standstill, and this year the laptop has been hindering me from learning and experimenting with new technology at home.  And my circa 2000 Pentium III 733 under the desk is relegated to file storage, and way overdue for being donated to a rural school.&lt;br /&gt;
&lt;br /&gt;
The Time Has Come for a new machine!  But not an off the shelf rip-off: I have a specific philosophy about what goes into a good computer.   My philosophy for a personal computer:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Buy for a 5 year lifespan.&lt;/b&gt;  Less than 5 years makes a computer one expensive consumable.  Even at my R10,000 price point, computing is a R2000 per year expense.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Skip generations.  &lt;/b&gt;I am buying a Core 2 Duo,  and my next PC will be the successor to the Core i7 (but only once &lt;i&gt;its &lt;/i&gt;successor comes out - see "best of 18 months ago")&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Buy wholesale parts&lt;/b&gt;.  I thoroughly recommend &lt;a href="http://dc3.co.za/"&gt;DC3 Distributors&lt;/a&gt; - the powerful box below comes to the same R8000 that one would normally pay for underpowered entry level crud at Incredible Connection.   Be prepared to spend hours reading hardware reviews, benchmarks and spec sheets to be sure you are getting reliable, performing, mutually-compatible parts.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Buy the best of 18 months ago.&lt;/b&gt;  After the new generation arrives (give it 18 months), the previous generation becomes mid-range, and yields the best price/performance ratio.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;It will always cost around R10,000&lt;/b&gt;.  The "best of 18 months ago" desktop always comes to around R10,000 (including monitor).  This principle, stated by my father, has held between 1987 (remember the 80386?) and 2009 (Core 2 Duo / Phenom II)&lt;/li&gt;
&lt;/ul&gt;
In summary this leads me to &lt;a href="http://dc3.co.za/"&gt;http://dc3.co.za/&lt;/a&gt;, where I put together a machine involving this stuff, including VAT.  It should be ready in a week:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Processor (R1411): &lt;/b&gt;Intel Core 2 Duo 2.8GHz, 3MB L2 cache&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Motherboard (R1165): &lt;/b&gt; ASUS-P5QL Pro Intel P43 chipset, 1066MHz FSB&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RAM (2xR298): &lt;/b&gt;2 x Apacer 2GB DDR2 PC6400 (400MHz, 800MT/s&lt;b&gt;)&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Graphics (R1233): &lt;/b&gt;Zotac Nvidia 9800GT 512MB GDDR3, at 660MHz &lt;i style="color: #b45f06;"&gt;(couldn't get the "Eco" version in SA)&lt;/i&gt;&lt;b&gt; &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Disk (2xR679): &lt;/b&gt;2 x Western Digital Caviar Green 500GB / 16MB cache &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Optical (R350)&lt;/b&gt;: Sonu DRU-830C &lt;span style="color: #b45f06;"&gt;(old drive I already had - recommend a silent DVD drive instead)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Wifi (R254): &lt;/b&gt;DLink 54Mbps WiFi &lt;i style="color: #b45f06;"&gt;(had some driver problems under Win7)&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Case (R439): &lt;/b&gt;CoolerMaster Elite 335 ATX &lt;i&gt;&lt;span style="color: #b45f06;"&gt;(took Sileo 500 instead)&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PSU (R450): &lt;/b&gt;Gigabyte ODIN 470W &lt;i style="color: #b45f06;"&gt;(took silent PSU instead)&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Mouse (R225): &lt;/b&gt;Microsoft Comfort Optical 3000 &lt;i&gt;&lt;span style="color: #b45f06;"&gt;(no longer available, took a Logitech mouse instead but not happy with the loud clicks)&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Keyboard (R600): &lt;/b&gt;Logitech Wave &lt;i style="color: red;"&gt;(bad choice)&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Monitor (R2300): &lt;/b&gt;Samsung 2494HS, 23.6 inch 16:9,1920x1080 &lt;span style="color: red;"&gt;(should have got height-adjust stand)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Assembly (R114):&lt;/b&gt; Because frying the motherboard costs a lot more.&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
The total comes to R8,194 excluding the monitor, and R10,494 including.  AFAIK the CPU, motherboard, graphics and RAM were all available 18 months ago (January 2008).   The monitor, keyboard and mouse are higher end parts, you could save R500 on kb/mouse and R800 with a 19" monitor, to bring the total down to R9100.&lt;br /&gt;
&lt;br /&gt;
You might ask, why not a new laptop, such as the new MacBook Pro?  The answer is lifestyle.  I almost never have to work 'on the go'.  When I work, it is in my nerd cave, for hours at a time.  If you have to work at clients, or wherever you may be, a laptop is the answer.  I only work at the office and at home, so a desktop suits me fine, and I can get much more power for less by doing so.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Silent Computing Update&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I've amended the order to get some more premium parts to make the computer silent:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;PSU (R1234):&lt;/b&gt; CoolerMaster Silent Pro M500&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Chassis (R819):&lt;/b&gt; CoolerMaster Sileo 500&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Graphics (R1233):&lt;/b&gt; Zotac Geforce 9800GT Eco&lt;/li&gt;
&lt;/ul&gt;
The PSU is ~80+% efficiency instead of ~70%, so the fan can run at a lower speed for a given wattage. The Sileo 500 chassis has silent fans and insulation, and no side ventilation so it is warmer but internal fan noise is damped. The 9800GT Eco is an underclocked version of the 9800GT that uses 40% less power, so needs less cooling. The new system should draw under (76+50+12+30)/0.80 = 210W idle and 300W fully loaded, versus about (120+50+12+30)/0.70=300W idle and 440W fully loaded.&lt;br /&gt;
&lt;br /&gt;
The total price is R9009 without the monitor, increasing cost by R1100 to get something quiet and efficient.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Lessons Learned&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Keyboard:&lt;/b&gt; I no longer recommend the Logitech Wave keyboard.&amp;nbsp; It's somewhat loud, I don't like the feel of the keys which are a bit loose, and I think the "wave" curve in the keys is pure marketing gimmick.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Monitor: &lt;/b&gt;The Samsung 2494HS 23.6" monitor... you can now get similar monitors for under R2300, and this one came with a fixed base.&amp;nbsp; Do ask for a height-adjustable base!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-3118075027921016917?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/C-oHL3GpkDA" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/06/new-machine-guiding-principles-for.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/3118075027921016917?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/3118075027921016917?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/C-oHL3GpkDA/new-machine-guiding-principles-for.html" title="How to select parts for a custom computer" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/06/new-machine-guiding-principles-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMBSXY9fyp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-1507195301420791523</id><published>2009-03-07T12:59:00.002+02:00</published><updated>2009-10-19T10:54:18.867+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:54:18.867+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>QWERTY layout dumped in favour of low-pain Colemak</title><content type="html">I can type simple lower-case words at over 100 words per minute on a QWERTY keyboard, slowing down for more complex texts with lots of numbers and punctuations or if the writing takes a lot of thought. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;QWERTY Pain&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
However, typing fast on QWERTY puts a lot of strain on the fingers.  The QWERTY layout has two design goals (1) to be able to type "typewriter" on the top row for demonstrations, and (2) prevent typewriter keys from jamming.&lt;br /&gt;
&lt;br /&gt;
Goal (1) puts frequent keys like t,e,r and i on the top row, and goal (2) results in a lot of "same-finger jumping" where the same finger has to jump rows to type common pairs of letters - for example ed, ce, ju, im, mu, nu, mi, um, ol, lo, ki. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Colemak Layout&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_rswIZalsPuc/SbJSFylJ3XI/AAAAAAAABFA/iB-jjP4lqP8/s1600-h/Colemak_vs_qwerty.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_rswIZalsPuc/SbJSFylJ3XI/AAAAAAAABFA/iB-jjP4lqP8/s320/Colemak_vs_qwerty.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
For a while I've looked at buying some sort of fancy ergonomic keyboard from a manufacturer that doesn't realise how broken QWERTY is.  Then via some iPhone app news mentioning it I came across the &lt;a href="http://www.colemak.com/"&gt;Colemak&lt;/a&gt; website.  Colemak is a keyboard layout designed in 2006, partially computer-optimised.  According to its model, more than halves typing effort versus QWERTY, about the same as Dvorak but with features that make it easier to learn:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Home row keys (arstdhneio) put the 10 most frequent letters in English under your fingertips&lt;/li&gt;
&lt;li&gt;Pinky finger is used only rarely&lt;/li&gt;
&lt;li&gt;Loads of "hand-roll combos" where you type 2, 3 or even 4 keys in one smooth motion.&lt;/li&gt;
&lt;li&gt;10 keys stay where they are in QWERTY (namely Q,A,Z,X,C,V,B,H,M)&lt;/li&gt;
&lt;li&gt;Most windows keyboard shortcuts stay the same (see above)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;All keys except E and P are typed with the same finger or same hand as on QWERTY.&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Learning Colemak&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Colemak can be learnt using &lt;a href="http://typefaster.sourceforge.net/"&gt;TypeFaster&lt;/a&gt; on Windows or &lt;a href="http://ktouch.sourceforge.net/"&gt;KTouch&lt;/a&gt; on Linux or the &lt;a href="http://keybr.com/welcome"&gt;Keybr&lt;/a&gt; Flash applet, and download lessons from the &lt;a href="http://www.colemak.com/"&gt;www.colemak.com&lt;/a&gt;.   In Windows you install the custom Colemak layout and switch between QWERTY and Colemak with shortcut keys.  Colemak is for touch-typing, so you are not supposed to go to the effort of physically re-labelling your keyboard and may not even need to print a cheat sheet if you do a few hours of lessons first.&lt;br /&gt;
&lt;br /&gt;
I started on Monday with GTypist lessons, and also used KTouch.   On Windows, TypeFaster has an awesome feature where it generates personalised lessons that drill you on your slowest or least accurate keys.&lt;br /&gt;
&lt;br /&gt;
On Thursday, I switched my keyboards to Colemak, which was annoying for a while as my speed was under 20 words per minute and accuracy was low and I had to relearn some shortcuts. &lt;br /&gt;
&lt;br /&gt;
It's now Saturday and I've hit 30 words per minute, though more like 20 right now but with better accuracy.&lt;br /&gt;
&lt;br /&gt;
I don't seem to have forgotten QWERTY.   Given a minute to adjust, I can switch between QWERTY and Colemak as I please.  I just need to remember to keep practising a few minutes a day.&lt;br /&gt;
&lt;br /&gt;
Masochists may instead be interested in the &lt;a href="http://mkweb.bcgsc.ca/carpalx/?tnwclr"&gt;TNWCLR&lt;/a&gt;, which increases typing effort 112% over QWERTY.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-1507195301420791523?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/BbA37wVja4g" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/03/qwerty-layout-dumped-in-favour-of-low.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/1507195301420791523?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/1507195301420791523?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/BbA37wVja4g/qwerty-layout-dumped-in-favour-of-low.html" title="QWERTY layout dumped in favour of low-pain Colemak" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_rswIZalsPuc/SbJSFylJ3XI/AAAAAAAABFA/iB-jjP4lqP8/s72-c/Colemak_vs_qwerty.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/03/qwerty-layout-dumped-in-favour-of-low.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcESHs6eip7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-7586614819802754978</id><published>2009-02-15T21:46:00.011+02:00</published><updated>2009-10-19T10:46:49.512+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:46:49.512+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><category scheme="http://www.blogger.com/atom/ns#" term="finance" /><title>Ponzi schemes, and low-dividend shares</title><content type="html">&lt;i&gt;Brace for armchair economics and philosophy.  Please &lt;i&gt;ensure your seat&lt;/i&gt; belt is securely fastened.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Summary: &lt;/span&gt;&lt;span style="color: #000099;"&gt;The answer is &lt;/span&gt;&lt;span style="color: #000099; font-style: italic;"&gt;no&lt;/span&gt;&lt;span style="color: #000099;"&gt;, shares lack the defining feature of ponzi schemes.  However, for the many shares that lack worthwhile dividends, they have some features in common with baseball cards and other collectibles: namely such shares have no value besides their sentimental value&lt;span style="font-style: italic;"&gt; &lt;/span&gt;and what&lt;/span&gt;&lt;span style="color: #000099;"&gt; another collector is willing to pay you.&lt;/span&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;b&gt;Madoff's Ponzi Scheme&lt;/b&gt;: Seeing a newspaper today at a climbing weekend in Montague, I read about &lt;a href="http://en.wikipedia.org/wiki/Bernard_L._Madoff"&gt;Bernard Madoff&lt;/a&gt;, who was arrested in December 2008, and whose hedge fund has been declared the largest one-man &lt;a href="http://www.sec.gov/answers/ponzi.htm"&gt;Ponzi Scheme&lt;/a&gt; in history (aka Pyramid Scheme).  He would take in investors money, and used it to pay out the earlier investors who cashed out, keeping the rest to himself.   $50 billion evaporated when the scheme was exposed because too many people pulled out during the 2008 crash to pay them all out.   Madoff spent the time enjoying life, dabbling in markets, and fooling blinded-by-greed investors and the Securities and Exchange Commission.  Sucks to be you, investor.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Stock Market == Ponzi Scheme?&lt;/b&gt; Doesn't the stock market work similarly? Very few companies pay substantial dividends, preferring to push their share price up by reinvesting.   Without dividends, all of the money payed out to earlier investors is coming from the new investors paying in... just like a Ponzi scheme.   An increase in share price does not magically create money - that is instead the &lt;a href="http://boingboing.net/2008/12/03/where-money-comes-fr.html"&gt;sacred duty&lt;/a&gt; of the government and &lt;a href="http://en.wikipedia.org/wiki/Fractional-reserve_banking"&gt;fractional reserve banking&lt;/a&gt;. &lt;b&gt; &lt;/b&gt;I googled the &lt;i&gt;Stock Market  == Ponzi Scheme&lt;/i&gt; idea and found this article by Dan Goldstein on &lt;a href="http://dangoldstein.blogspot.com/2002/11/stock-market-as-ponzi-scheme-faqs.html"&gt;The Stock Market as a Ponzi Scheme&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Now to evaluate some evidence...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Do shares give you ownership?  &lt;/b&gt;Dan discusses the point that shares give you  part ownership of the company, while Ponzi schemes only give you a promise of being paid out with too-good-to-be-true profits.    But when you don't have a seat on the board, and the CEO won't take your calls... you don't have any measurable influence on the company, and therefore no ownership that counts.  To get meaningful ownership rights, start saving for a 5% stake in the company.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Robbing Peter to pay Paul.&lt;/b&gt; When the market crashed last year, it was solely due to the credit crunch: more investors wanted to sell out, but there was a lack of incoming money (and credit), thus fewer buyers, pushing prices down.  It had nothing to do with the economic value of the everyday widget-making companies whose share prices dropped 30-50%.    Then again, the same applied to housing prices.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Baseball cards vs Ponzi Scheme &lt;/b&gt;Shares lacking dividends are much like baseball cards - no value other than the willingness of someone else to buy them off you.  But baseball cards are &lt;i&gt;not&lt;/i&gt; Ponzi schemes.&lt;br /&gt;
&lt;br /&gt;
Compare baseball cards to the Madoff fund.  Investors bought units from Madoff, and sold them back to Madoff later for profit.  What made Madoff's fund a Ponzi scheme is that Madoff was &lt;i&gt;pretending&lt;/i&gt; to give out profit to lure more investors.  In reality he was paying earlier investors out of the incoming money, and doing what he pleased with the remainder.   A real hedge fund can liquidate and pay out all of its investors at the stated unit price.  Madoff's fund could not because it wasn't making any profit, the fact which eventually exposed the scam.&lt;br /&gt;
&lt;br /&gt;
But baseball cards and shares do not have a Ponzi structure - they are just an asset whose value is "all in the mind".   Unlike Madoff's "Ponzi fund", there is no central entity controlling all shares in Company X who could pass money from buyers to sellers and do what he pleases with the leftovers, so long as there are more buyers than sellers.   I conlude that stocks are not Ponzi schemes, because of vital structural difference:  investors trade shares as if they were cards, not as if they were buying units in a mutual fund.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4. A side-note Economic Value: &lt;/b&gt;Arriving at armchair philosophy, economic value is solely a human phenomenon, having no existence outside of the minds of humans, much like &lt;a href="http://grahamweekly.blogspot.com/2007/07/douglas-adams-is-there-artificial-god.html"&gt;God&lt;/a&gt; (self-link re Douglas Adams' "Is there an artifical God?" speech), or Right and Wrong (the Universe doesn't care, but people do).  Nonetheless, so long as economic value is being created there will be more buyers into stocks, and it survives.  If value starts being destroyed faster than it is created, the all-share index would decline, but it wouldn't necessarily collapse like a Ponzi scheme.&lt;br /&gt;
&lt;br /&gt;
So the stock market isn't a Ponzi scheme, but the two have enough shared characteristics to confuse me for a while.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-7586614819802754978?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/20Xt94cyonk" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/02/stock-market-pyramid-scheme.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7586614819802754978?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7586614819802754978?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/20Xt94cyonk/stock-market-pyramid-scheme.html" title="Ponzi schemes, and low-dividend shares" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/02/stock-market-pyramid-scheme.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMMR349fSp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-3286421113737244403</id><published>2009-01-29T13:34:00.280+02:00</published><updated>2009-10-19T10:54:46.065+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:54:46.065+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Bad Python</title><content type="html">I've seen quite a lot of bad Python, even though Python makes the Path of Good Code relatively easier to find than other languages where spaghetti is the result without extra discipline and years of dedicated study of the language on the part of the programmer.  Such is the Tao of Perl.

Much bad Python however is from programmers who only knew statically typed OO languages (Java/C++/C#) and have not yet grokked dynamic typing,  first-class functions, pervasive use of iterators, properties, etc, leading to eyesores such as:
&lt;ul&gt;&lt;li&gt;Accessors such as getDistance() and setDistance(), instead of using an attribute. In Python, attributes can be turned into properties later, preserving the class interface.&lt;/li&gt;&lt;li&gt;Asserting the type of every argument and returned value, taking up maybe 30% of the code itself and 80% of the unit test code.  Checking is usually pointless because the interpreter itself will let you know if &lt;i&gt;someduck&lt;/i&gt; didn't &lt;i&gt;.quack()&lt;/i&gt; like a duck, and makes the code less flexible.
&lt;/li&gt;&lt;li&gt;Uber-private attributes (for no good reason), going so far as to use  double-underscores on each side, which are supposed to be reserved for language features.&lt;/li&gt;&lt;li&gt;Dozens of customising parameters in constructors, such as &lt;i&gt;reversed&lt;/i&gt; and &lt;i&gt;strip &lt;/i&gt;and &lt;i&gt;maxlen&lt;/i&gt; - when passing in a general &lt;i&gt;transform&lt;/i&gt; function would be so much more elegant and could do so much more than just reverse the strings that the class works with.
&lt;/li&gt;&lt;li&gt;Delegates where first-class function will do.&lt;/li&gt;&lt;li&gt;Wrapping things classes when dicts and tuples would be cleaner.
&lt;/li&gt;&lt;/ul&gt;
Partly, the developers don't recognise the ways in which many Design Patterns become trivial in Python, to the extent that they are more like one-line idioms than chapter-worthy Patterns with capital "P".   Singleton Pattern? Write a module.  Iterator? It's fundamental to the language.  Need a Factory Pattern? Write a function and thanks to dynamic typing you can substitute &lt;span style="font-style: italic;"&gt;makedummywidget&lt;/span&gt; for the &lt;span style="font-style: italic;"&gt;makewidget&lt;/span&gt;&lt;span&gt; during testing&lt;/span&gt;.Flyweight objects or Command Dispatch?  Just use a dictionary.  See also &lt;a href="http://www.suttoncourtenay.org.uk/duncan/accu/pythonpatterns.html"&gt;Python Patterns&lt;/a&gt;. &lt;span style="color: rgb(102, 102, 102);font-size:78%;" &gt;(correction: previously referred to Abstract Factory, which is is not a factory but a group of related factories, e.g. for widgets from a given UI toolkit).  &lt;/span&gt;

Besides bad habits acquired from static OO, one can write bad code, in any language with
&lt;ul&gt;&lt;li&gt;Vague and misleading identifiers (topic of future post)
&lt;/li&gt;&lt;li&gt;Massive 'god' classes&lt;/li&gt;&lt;li&gt;Source files having no discernable structure.
&lt;/li&gt;&lt;li&gt;Awkward decompositions of function&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Forces similar logic to be repeated in dozens of places&lt;/li&gt;&lt;li&gt;Prevents parts from being reused e.g. in unit tests &lt;/li&gt;&lt;li&gt;Prevents dependencies from being stubbed out e.g. in unit tests&lt;/li&gt;&lt;li&gt;Mixing logic with orthogonal aspects like error-handling and logging for a harder-to-maintain mess.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Oh well.   I recently spent a day re-doing about 30% of the functionallity of 8,600 lines of someone elses Java-style Python into 200 lines of real Python to support the greater flexibility I needed.  Code can be that bad. &lt;span style="font-size:78%;"&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;(later expanded to just under 300 lines thanks to feature creep)&lt;/span&gt;&lt;/span&gt;

From the comments:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://dirtsimple.org/2004/12/python-is-not-java.html"&gt;Python is not Java&lt;/a&gt; (a related rant about using Java idioms in Python)&lt;/li&gt;&lt;li&gt;&lt;a href="http://python.net/%7Egoodger/projects/pycon/2007/idiomatic/handout.html"&gt;Idiomatic Python&lt;/a&gt; (if you want examples of idioms in Python)
&lt;/li&gt;&lt;li&gt;&lt;a href="http://oreilly.com/catalog/9780596007973/"&gt;Python Cookbook&lt;/a&gt; (preview online at &lt;a href="http://my.safaribooksonline.com/0596007973"&gt;Safari Books&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://queue.acm.org/detail.cfm?id=1039535"&gt;How not to write FORTRAN in any language&lt;/a&gt; especially on readability and how a language can help and hinder good design.
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-3286421113737244403?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/LRfRf8vjKRE" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/01/bad-python.html#comment-form" title="25 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/3286421113737244403?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/3286421113737244403?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/LRfRf8vjKRE/bad-python.html" title="Bad Python" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">25</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/01/bad-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcESHs6eip7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-1853347666707180727</id><published>2009-01-18T13:44:00.000+02:00</published><updated>2009-10-19T10:46:49.512+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:46:49.512+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="finance" /><title>Small investing is too much work</title><content type="html">I'm not offering any financial advice here, just jotting down some thoughts I had while I was munching on Pick 'n Pay muesli for breakfast this afternoon wondering how on earth one is supposed to know when to sell unit trusts.&amp;nbsp;&amp;nbsp; I don't even invest much (one unit trust, that's it).&amp;nbsp; Investing is buying a stake in a company, and according to Warren Buffet (I think), one is supposed to imagine that one is buying the &lt;i&gt;whole&lt;/i&gt; company, and do the research commensurately before buying. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;It's like buying a company, really&lt;/b&gt;. What that means, is that investing is a lot of work.&amp;nbsp; I spent three months researching before buying a car, having called up dozens of dealers and collated the offers the made, compared all of the 31 currently popular hatchbacks in SA on dozens of critera, went through hundreds of car ads and gotten a feel for car prices and feature trade-offs, visited the dealer I bought from on five separate occasions in two weeks, negotiated for a couple of hours spread out over a week - once I was sure I finally parted with quite a few months of labour-equivalence in money to obtain the car.&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Opportunity cost of research&lt;/b&gt;. Imagine having to put that much work in to pick a good company to buy (shares in). Big institutional investors really do throw that kind of effort into their investments.&amp;nbsp;&amp;nbsp; The effort may not be worth it for a small investment.&amp;nbsp;&amp;nbsp; Think: one must buy at least R10,000 of a share to reasonably make some profit after the cut from brokerage fees.&amp;nbsp; But to make a good investment takes hours of researching that company, along with dozens of other candidate.&amp;nbsp;&amp;nbsp;&amp;nbsp; That time has value too: the opportunity cost of spending it researching investments, instead of doing something else and enjoying life.&amp;nbsp;&amp;nbsp; The monetary return on a small investment is not big enough to justify the expense of research.&amp;nbsp; For example, suppose one could put in 40 hours of research and monitoring over 6 months, and through that make a couple of purchases and sales in single shares that result in 20% profit over the 6 months. &amp;nbsp; However, suppose one only invested R20,000 due to risk profile, thus netting R4000 profit.&amp;nbsp; That's only R100/hour, &lt;i&gt;before&lt;/i&gt; tax, for investing right at the limit of your risk tolerance.&amp;nbsp;&amp;nbsp; One might need about R100,000 available to invest (being money that one can afford to lose without materially affecting ones standard of living now or in the future) before the payoff starts to make the share research worthwhile.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Investing vs gambling&lt;/b&gt;.&amp;nbsp; It takes a lot of work to make a good investment, and it follows
that someone who buys a share they heard was good and hope it works
out, would be better off with the slot machines at Grand West Casino.&amp;nbsp;&amp;nbsp;
Some friends and I in fact went out to Grand West last night.&amp;nbsp; Three of
use quickly went through the money we'd loaded onto the cards (R30 for
me), the fourth won about R140, and another guy won about R500 (he's
probably going back to lose it all in future trips trying to repeat the
experience).&amp;nbsp;&amp;nbsp; So, now I know how to play slots, but I still don't get
it.&amp;nbsp; We commented on how the people seemed really rude - totally
oblivious to others, some with looks of desperation on their faces,
others doing things like sweeping a finger across the screen before
each bet, and skollies hanging around outside waiting for
pickpocketing/snatching opportunities.&amp;nbsp;&amp;nbsp;&amp;nbsp; Ok that had nothing to do with shares, except that many people are effectively gambling with shares, not investing in them.&lt;br /&gt;

&lt;br /&gt;

&lt;b&gt;When to sell a unit trust?&lt;/b&gt;&amp;nbsp; With shares one of course needs a tight strategy complete with stop-losses, profit taking etc.&amp;nbsp; Sell this share to take profits at a strategic moment, do some research and pick the next share to invest in.&amp;nbsp; But unit trusts hold lots of shares - it's almost like an index fund, except trusting the fund manager to make better-than-index return through active management, even after fees - which is often not the case.&amp;nbsp;&amp;nbsp; What's the point of selling one unit trust, only to buy another one which almost certainly invests in the same big companies as the first one?&amp;nbsp;&amp;nbsp;&amp;nbsp; One also sells out of a share when the research says its growth potential is reducing.&amp;nbsp;&amp;nbsp; But for a unit trust, its like selling out of the market - you do with when the whole market is unlikely to make big gains, which is an exceptionally difficult thing to judge.&amp;nbsp; So, in a sense unit trusts are simpler to buy because somone else does the shares research, but they are much more complicated to know when to sell.&lt;br /&gt;
&lt;br /&gt;
K, hope you enjoyed Graham's randomness for the day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-1853347666707180727?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/iK2DJCd85TA" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/01/small-investing-is-too-much-work.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/1853347666707180727?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/1853347666707180727?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/iK2DJCd85TA/small-investing-is-too-much-work.html" title="Small investing is too much work" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/01/small-investing-is-too-much-work.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcESHs6eyp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-6983658403844752050</id><published>2009-01-10T15:01:00.010+02:00</published><updated>2009-10-19T10:46:49.513+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:46:49.513+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><title>Quake 3 Config</title><content type="html">The new colleagues brought an after-work tradition of of playing the Quake 3 multiplayer first-person shooter computer game.

Unfortunately I sucked at first. Main problems:
&lt;ol&gt;&lt;li&gt;Visibility: can't see through the gibs and shells.  It felt like I was playing paintball.
&lt;/li&gt;&lt;li&gt;Mouse sensitivity: 8 times the default, jumping all over the place.&lt;/li&gt;&lt;li&gt;Keybindings: annoying trying to change weapons or zoom.&lt;/li&gt;&lt;li&gt;Camouflage: The blue "team" model really stands out. Switched to small brown player models like 'bones/bones'/
&lt;/li&gt;&lt;li&gt;Technique: had rocket and railgun wrong, didn't traverse the map properly or look around properly with the mouse.
&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;My &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://snipplr.com/view/11241/tweaked-quake-3-arena-autoexeccfg/"&gt;Quake 3 autoexec.cfg&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; has the following tweaks:&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;turns off muzzle flash, shells, gun model, gibs/blood for visibility.
&lt;/li&gt;&lt;li&gt;turns off level music to hear the other players.
&lt;/li&gt;&lt;li&gt;sets toggles for gun model and HUD to clear distractions.&lt;/li&gt;&lt;li&gt;tunes mouse sensitivity just high enough to allow 180-degree flick&lt;/li&gt;&lt;li&gt;set up multiple zoom levels&lt;/li&gt;&lt;li&gt;turned off bob/roll for slightly steadier crosshair&lt;/li&gt;&lt;li&gt;selected the circle + dot crosshair (cross-style can obscure small targets)&lt;/li&gt;&lt;li&gt;allow both keyboard and mouse weapon cycling&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://pastebin.com/f35d3f5bc"&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-6983658403844752050?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/EFCqvqCjASg" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2009/01/quake-3-config.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/6983658403844752050?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/6983658403844752050?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/EFCqvqCjASg/quake-3-config.html" title="Quake 3 Config" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2009/01/quake-3-config.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcESHs6eyp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-5590256613918445994</id><published>2008-12-29T16:09:00.003+02:00</published><updated>2009-10-19T10:46:49.513+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:46:49.513+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><title>Wear Sunscreen, already</title><content type="html">I went on a hike up Chapman's Peak on 20th December for a friend's birthday.  I had arrived late, so early on when we stopped for a minute I slapped some sunscreen on my arms and neck, then carried on  hiking.  A few hours later on our way down I felt the Burn: I had forgotten to later put sunscreen on my legs and face and legs had about 3-4 hours of exposure to midday sunlight, lower thigh catching most of it (face partly protected by the hat).  Some of the fellow hikers fared much worse.  Much after-sun lotion followed.  It didn't spoil the party and braai that evening, which was just fun cooking and talking with friends.

Some links to articles I've read on the subject.. &lt;a href="http://delicious.com/skygreen/sunscreen"&gt;http://delicious.com/skygreen/sunscreen&lt;/a&gt;

Using sunscreen effectively involves applying it 30 min before sunexposure, using a decent amount, and reapplying 30 min after the start of exposure, as well as afterswimming or toweling. Sunscreen marketers aren't particularly honest either, and many sunscreen products are not as protectiveagainst UVA they claim, do not achieve their rated SPF with the typical amountsapplied, and are not as water/sweat-resistant as claimed.

With this sunburn, I tried actively managing it: not soaping the burnt area when washing (soap removes skin oils), and twice daily applied aqueous cream (the petrolatum prevents moisture loss and thus prevents flaking, but traps heat so should only be used after the burn has cooled down) and after-sun lotion (soothes pain/itching and contains vitamin E which accelerates healing).  By day 6 the erythema (redness) had subsided, and on day 7/8 the top layer of skin peeled, but all came off in a few large pieces (instead of flaking) and left  healthy skin underneath.  Good result, so that may be a good way to manage sunburn.  This is just my observation, not to be taken as medical advice (I have no medical qualifications).  Still, as the first line of defence, &lt;a href="http://www.bondon.com/sunscreen_song.html"&gt;Wear Sunscreen&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-5590256613918445994?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/b6XHqs1P8Jc" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2008/12/wear-sunscreen-already.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/5590256613918445994?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/5590256613918445994?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/b6XHqs1P8Jc/wear-sunscreen-already.html" title="Wear Sunscreen, already" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2008/12/wear-sunscreen-already.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcESHs6eyp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-619705625938381116</id><published>2008-12-25T17:54:00.003+02:00</published><updated>2009-10-19T10:46:49.513+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:46:49.513+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><title>How to avoid Hijacking/Carjacking</title><content type="html">&lt;b&gt;All The Time&lt;/b&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_rswIZalsPuc/SXOxPrjP7QI/AAAAAAAABAE/9aj4WavfiMs/s1600-h/nohijack.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 128px; height: 128px;" src="http://3.bp.blogspot.com/_rswIZalsPuc/SXOxPrjP7QI/AAAAAAAABAE/9aj4WavfiMs/s200/nohijack.jpg" alt="" id="BLOGGER_PHOTO_ID_5292768870037187842" border="0" /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;Drive and park in well-lit, high-traffic areas.  Avoid dark, isolated roads and parking spots.&lt;/li&gt;&lt;li&gt;Stay visible: carjackers prefer victims who won't be seen by bystanders.&lt;/li&gt;&lt;li&gt;Always roll up windows before stopping to park or at lights.&lt;/li&gt;&lt;li&gt;Always lock your doors as soon as you enter the car and don't unlock till about to leave.&lt;/li&gt;&lt;li&gt;Keep valuables out of sight.&lt;/li&gt;&lt;li&gt;Report suspicious characters and vehicles to police.&lt;/li&gt;&lt;li&gt;Be in a group rather than alone.  Avoid driving alone where possible.&lt;/li&gt;&lt;li&gt;Keep your car well-maintained to prevent breakdowns.&lt;/li&gt;&lt;li&gt;Keep your car filled to avoid running out, or otherwise being forced to refuel.&lt;/li&gt;&lt;li&gt;Know your destination and route to avoid stopping to look at a map or ask directions.&lt;/li&gt;&lt;li&gt;Dropping someone off, make sure they are safely in their vehicle before departing.&lt;/li&gt;&lt;/ul&gt;
&lt;b&gt;Parked Environment&lt;/b&gt;
&lt;ul&gt;&lt;li&gt;Know the environment and be aware of anything out of the ordinary.&lt;/li&gt;&lt;li&gt;Check nearby and underneath car, especially if there is shrubbery or hiding spots nearby.&lt;/li&gt;&lt;li&gt;If loiterers are present, keep away form the vehicle and go to a public area to ask for assistance.&lt;/li&gt;&lt;li&gt;Check whether you are being followed to your parking spot, and if so go instead to a public area for assistance.&lt;/li&gt;&lt;li&gt;Have a friend escort you to your parked car (and escort friends as a courtesy).&lt;/li&gt;&lt;li&gt;Add/remove items from the trunk quickly.&lt;/li&gt;&lt;li&gt;Have key ready to enter the car as you approach it: do not fumble for keys.&lt;/li&gt;&lt;li&gt;Do not sit (or sleep) in the car unaware of surroundings.&lt;/li&gt;&lt;/ul&gt;
&lt;b&gt;Driving Environment&lt;/b&gt;
&lt;ul&gt;&lt;li&gt;Vary regular routes since professionals plan attacks on particular cars carefully.&lt;/li&gt;&lt;li&gt;Before parking, check mirror again to see whether you have been followed and continue driving if that is the case.&lt;/li&gt;&lt;li&gt;Plan an escape route at every intersection: stop 5 meters behind the next car and pick a lane with easy escape.&lt;/li&gt;&lt;li&gt;Avoid all contact, even eye contact, with pedestrians.&lt;/li&gt;&lt;li&gt;Use center lane: hijackers find road-side cars easier to attack.&lt;/li&gt;&lt;li&gt;Drive away hooting if there is a suspicious/hostile approach while stopped at lights.  Even turn through a red light if safe to do so.&lt;/li&gt;&lt;li&gt;Do not pull over randomly to read a map.&lt;/li&gt;&lt;li&gt;Avoid driving in 'dead hours' of night and early morning.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;
Common Tricks&lt;/b&gt;
&lt;ul&gt;&lt;li&gt;False appeals for help from a "breakdown" or stationary vehicle.&lt;/li&gt;&lt;li&gt;Bump-n-Rob where you are bumped from behind at traffic lights: common at night, with a carjacker in wait for when you get out. Drive away immediately if it is dark or anything is suspicious.&lt;/li&gt;&lt;li&gt;Jamming of electric gates.&lt;/li&gt;&lt;li&gt;Posing as a hitchhiker or faking an injury.&lt;/li&gt;&lt;li&gt;Posing as a traffic officer, but with unmarked/unofficial vehicle.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;
If Hijacked&lt;/b&gt;
&lt;ul&gt;&lt;li&gt;Exit the car immediately and run.&lt;/li&gt;&lt;li&gt;If you don't escape the car, crash it into a pole immediately, then run.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;
Statistics&lt;/b&gt;
&lt;ul&gt;&lt;li&gt;About a quarter of all carjackings take place in December.&lt;/li&gt;&lt;li&gt;Most carjackings take place between 8PM and 11PM (i.e. at night).&lt;/li&gt;&lt;li&gt;Highest risk in decreasing order: open parking lots, city streets, rural streets, driveways, gas stations.&lt;/li&gt;&lt;li&gt;Poorest areas (opportunists) and richest areas (professionals) are high risk.&lt;/li&gt;&lt;/ul&gt;
I researched and collated a dozen websites in mynotebook and only then decided to post the list: sorry for lack ofreferences.  Shouts out to every other "how to avoid carjacking" article on the web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-619705625938381116?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/kJoMU1hAYHo" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2008/12/how-to-avoid-hijackingcarjacking.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/619705625938381116?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/619705625938381116?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/kJoMU1hAYHo/how-to-avoid-hijackingcarjacking.html" title="How to avoid Hijacking/Carjacking" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_rswIZalsPuc/SXOxPrjP7QI/AAAAAAAABAE/9aj4WavfiMs/s72-c/nohijack.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2008/12/how-to-avoid-hijackingcarjacking.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIFRH4-fip7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-7093699350083329830</id><published>2008-12-23T14:07:00.002+02:00</published><updated>2009-10-19T10:55:15.056+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:55:15.056+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Code Generation vs Metaprogramming in ActiveRecord patterns</title><content type="html">My thoughts on the &lt;a href="http://qcodo.com/documentation/article.php/6"&gt;QCodo article&lt;/a&gt; I was reading, along with some Wiki and c2.

&lt;i&gt;ActiveRecord Pattern:&lt;/i&gt; "An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data".

&lt;i&gt;Metaprogramming&lt;/i&gt; (in Lisp/Scheme, and to a limited extent Python and Ruby) would generate a class library at run-time, for example to perform object-relational mapping with the ActiveRecord pattern.  In Python at least, the code is just the metaclass and decorators, and some custom logic added on.

&lt;i&gt;Benefits/Drawbacks:&lt;/i&gt; Metaprogramming keeps code small and simple.  Meta-changes take place in one piece of code (the metaclass), and database modification is simple, making metaprogramming efficient for rapid prototyping.  However, runtime reflection reduces performance (mitigated through caching of the analysis), and since the concrete code does not exist until run-time, there is no static checking of method calls or IDE auto-completion and contextual help for methods.  Step-through debugging is complicated for runtime-generated methods compared to concrete methods.  Metaprogrammingmay also run into language limitations (not with Lisp macros),necessitating code-generation to produce 'scaffolding' in certain cases(examples anyone?).

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_rswIZalsPuc/SXO1zFjJbKI/AAAAAAAABAk/fPqJ_i76tiQ/s1600-h/activerecord.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 97px;" src="http://3.bp.blogspot.com/_rswIZalsPuc/SXO1zFjJbKI/AAAAAAAABAk/fPqJ_i76tiQ/s320/activerecord.png" alt="" id="BLOGGER_PHOTO_ID_5292773876358016162" border="0" /&gt;&lt;/a&gt;

&lt;i&gt;Code generation&lt;/i&gt; (in PHP, Java, C#), generates the code of the class library from templates.  Custom logic is added in sub-classes or re-opened partial classes.

&lt;i&gt;Benefits/Drawbacks:&lt;/i&gt; Code Generation incurs no runtime performance hit, because analysis is during generation &amp;amp; compilation.  Compilers can check uses of the generated code and IDEs provide contextual documentation and auto-completion, and debuggers transparently step through the generated code.  Code generation templates may also be more general than the limited metaprogramming features e.g. of Python/Ruby.  However, the entire library must be re-generated when changing the templates or database schema, which may encourage over-architecting and reluctance to revise the model later, due to the added difficulty of implementing changes (unless planned out so as to support easy/quick re-generation).  Also, debugging generated code involves a very slow edit(template)-generate-compile-run cycle, instead of the edit(metacode)-run cycle of metaprogramming.

&lt;i&gt;Source Control:&lt;/i&gt; Code templates should be checked in, but it seems also the generated code, because the custom code depends on it, and in Java/C# the generator produces empty classes to hold custom code, which has to be checked in.  If pure generated code were not checked in, then code would be a 'pre-build' step, with the drawback of configuring and running the generator locally before the first compile.

I would tend to prefer metaprogramming in most cases, if only because I like small, tidy code.  One might imagine that the generated code is not &lt;i&gt;really &lt;/i&gt;code to avoid feeling like the code is bloated, since as much as 90% of the total could be generated boilerplate.

Wiki helpfully points out that compilers are code generators (of assembly and machine language), as are interpreters (of bytecode).  So everyone uses code generation... the question here is whether to generate code for the language one is typically writing in.  Code generation uses a higher level language to output code in a lower-level one, so needing code generators for Java/C# means that in some sense Java/C# are too 'low-level' for certain tasks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-7093699350083329830?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/V-vAgrV6kmk" height="1" width="1"/&gt;</content><link rel="related" href="http://qcodo.com/documentation/article.php/6" title="Code Generation vs Metaprogramming in ActiveRecord patterns" /><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2008/12/code-generation-vs-metaprogramming-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7093699350083329830?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7093699350083329830?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/V-vAgrV6kmk/code-generation-vs-metaprogramming-in.html" title="Code Generation vs Metaprogramming in ActiveRecord patterns" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_rswIZalsPuc/SXO1zFjJbKI/AAAAAAAABAk/fPqJ_i76tiQ/s72-c/activerecord.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2008/12/code-generation-vs-metaprogramming-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMBSXY9fyp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-7306694359236853243</id><published>2008-12-09T22:41:00.010+02:00</published><updated>2009-10-19T10:54:18.867+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:54:18.867+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>Insuring &amp; Protecting a Car</title><content type="html">I have finally decided to buy a car, and called up several insurers regarding 3rd party, fire and theft insurance. Comprehensive insurance is too expensive: the comprehensive premiums equal the payments on an equivalent car on a 72-month financing term.  Instead, I will have to drive defensively and park carefully, and pay for my own lapses of judgement.   These are the insurers from whom I obtained telephonic quotes:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.dialdirect.co.za/"&gt;Dial Direct&lt;/a&gt; - a 'direct' insurer &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.budgetinsurance.co.za/"&gt;Budget&lt;/a&gt; - likely backed by another insurer&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.autogen.co.za/"&gt;A&amp;amp;G&lt;/a&gt; via V-plus brokers (large commission, it appears)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.unity.co.za/"&gt;Unity
&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Santam Direct&lt;/li&gt;&lt;/ul&gt;I went with the &lt;a href="http://www.santam.co.za/"&gt;Santam&lt;/a&gt; Multi-Motor package.  Oddly,&lt;a href="http://www.google.co.za/search?q=%22Santam+Direct%22"&gt; "Santam Direct"&lt;/a&gt; as an entity is almost Google-proof.  When I called Santam the operator had said "sorry we only deal with brokers, but we can put you through to Santam Direct", and put me through to &lt;a href="http://www.santam.co.za/contactus.asp?s=con"&gt;0860 444 444&lt;/a&gt;, which introduces itself as "Santam Direct".  The lack of Internet presence may be cause for concern.  &lt;span style="font-style: italic;"&gt;Update: from a PDF on  &lt;/span&gt;&lt;a href="http://online.santam.co.za/best/FAQs%20to%20staff_final.pdf" style="font-style: italic;"&gt;Santam's Int(ra/er)net&lt;/a&gt;&lt;span style="font-style: italic;"&gt; what the operator referred to as "Santam Direct" may be a default broker to which non-brokers are redirected, a joint venture between Santam and Sanlam starting only this year.  I will call tomorrow to find out more about this mysterious broker that I just bought insurance from. &lt;/span&gt;


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_rswIZalsPuc/SXOznBvtUgI/AAAAAAAABAU/wFpa069g_P0/s1600-h/insurance3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 226px; height: 320px;" src="http://3.bp.blogspot.com/_rswIZalsPuc/SXOznBvtUgI/AAAAAAAABAU/wFpa069g_P0/s320/insurance3.jpg" alt="" id="BLOGGER_PHOTO_ID_5292771470155272706" border="0" /&gt;&lt;/a&gt;
Santam has an older fee structure: low premiums, no "cash back", and high excess of R2500 plus endorsements: for example +R1000 for not having a tracker in a theft claim, for claiming in first 6 months, or for claiming 2+ times in a year, and +R1500 when someone else was driving (non-additive: simply choose the highest endorsement).   Compare this philosophy to Budget and others having premiums about 70-75% higher than Santam, low excess (R700) and 10-25% "cash back" after 2-4 years.

&lt;b&gt;My Reasoning:&lt;/b&gt; On Santam Limited Insurance (3rd party, fire, theft), one saves money by taking precautions to avoid having to claim.  With Budget et al, premiums are higher while claiming is cheaper (less need for caution), but "to claim or not to claim?" is complicated by the Cash Back Bonus which is lost on claiming.  That results in some messy risk calculations with which I do not wish to concern myself, and I therefore prefer low premiums up front.  On claiming, I will view the Santam R2500-R4000 excess as paying in those additional premiums that I would payed anyway to a low-excess insurer.  It might be called a "negative-cash-back because-you-claimed anti-bonus", which doesn't have the same ring as the "cash-back no-claim bonus" of the low-excess insurers, but the concept appeals to me.

&lt;b&gt;Tracker&lt;/b&gt;.  An additional option is a &lt;a href="http://www.tracker.co.za/"&gt;Tracker&lt;/a&gt; or similar device (Netstar, Bandit, CarTrack, Buddy, CellSecure, CellStop, C-Track, Matrix, DataTrack, NeoTrack, SkyTrack, SmartTrack).  The "Retrieve" Tracker(tm) is normally R1450 installation + R142pm on month-to-month basis, or R185pm on a 36 month contract (month-to-month breaks even with contract at 33.7 months).   For Santam clients, Tracker offers a R115pm x 36 month contract, which is R2520 less than the normal contract over 36 months, and removes the +R1000 "endorsement" of additional excess if the car is non-tracked when stolen.

&lt;b&gt;Hippo Comparison&lt;/b&gt;: &lt;a href="http://hippo.co.za/"&gt;hippo.co.za&lt;/a&gt; provided comparative generic E-quotes on 3rd party, fire and theft.  The Santam telephonic quote was approximately one third of the DialDirect and Budget E-quotes (without Tracker).    Without tracker, DialDirect and Budget telephonic quotes were about 65% of their own E-quotes.    With Tracker, Santam was 60% of the E-quotes, and with tracker DialDirect and Budget were slightly higher than their E-quotes.

&lt;b&gt;Deterrents&lt;/b&gt;: Security devices that require installation should be done by a &lt;a href="http://www.vesa.co.za/ProductsAndManufacturers.aspx"&gt;VESA-approved provider&lt;/a&gt;.  Various devices include "Alligator" steering wheel lock advertised as "even cutting in 4 places isn't enough", clutch pedal lock, wheel lock-nuts, gear locks, and gimmicks such as radio transmittors and SMS-sending devices to notify you when someone enters or starts the car (like bank login alerts), or a hidden fuse which blows unless you put the drivers' seatbelt on (latter could go really wrong).  Mechanical barriers will slow down a team possessing a battery-operated angle-grinder by at most 10-15 minutes.  Immobiliser units can also be swapped out in a couple of minutes, but the thieves need a specific unit to match the car model.  If one makes the car a difficult "15-minute job", and combines it with alerting on vehicle entry, that should give the local patrol cars time to get there before the thieves drive off.  So Plan A is deterrence, Plan B could be alerting+barriers to give cops time to catch the thieves, Plan C could be Tracker, and Plan D is insurance.  Plan E is moving somewhere with a garage.

Alerting is tricky.  Baseline would be an alarm siren.  A custom device might use a short-range radio transponder (receiver beeps on activation), or set a mobile device to send an SMS alert.  Lazyweb, what would you recommend?  Or would an alerting device be overdoing it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-7306694359236853243?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/BQgnj5DXHI8" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2008/12/insuring-protecting-car.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7306694359236853243?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7306694359236853243?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/BQgnj5DXHI8/insuring-protecting-car.html" title="Insuring &amp; Protecting a Car" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_rswIZalsPuc/SXOznBvtUgI/AAAAAAAABAU/wFpa069g_P0/s72-c/insurance3.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2008/12/insuring-protecting-car.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4ARXw8eSp7ImA9WxNVGU4.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-3891168086892186006</id><published>2008-12-06T21:22:00.001+02:00</published><updated>2009-10-30T23:25:44.271+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-30T23:25:44.271+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="journal" /><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><title>Mid-ObzFest Blogging</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_rswIZalsPuc/SXO0uYstNQI/AAAAAAAABAc/18Mg5xLIVbc/s1600-h/loveobs.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 120px; height: 174px;" src="http://4.bp.blogspot.com/_rswIZalsPuc/SXO0uYstNQI/AAAAAAAABAc/18Mg5xLIVbc/s320/loveobs.jpg" alt="" id="BLOGGER_PHOTO_ID_5292772696087409922" border="0" /&gt;&lt;/a&gt;
Hi everyone

ObzFest is a lot of fun - just arrive, and within about five minutes of walking around run into people you know, chill with a drink and chat and move on, only to run into more friends (repeat).  It's a multiplied version of Stones, with live bands and more chilled bars like Roots with nice atmosphere and stupendous cover charge for it.

But: the means of actively co-ordinating with friends needs improvement!  Normal phone calls simply do not work.  SMSing is strictly one-on-one - it takes lots of SMSing to get a few of people together and even then you're out of sync.  What a pain.  I don't know how well MXit works as an alternative.

A possible answer, I believe, is &lt;a href="http://twitter.com/grahampoulter"&gt;Twitter&lt;/a&gt; (or &lt;a href="http://identi.ca/"&gt;identi.ca&lt;/a&gt;).

1. Sign up at &lt;a href="http://twitter.com/"&gt;twitter.com&lt;/a&gt;.  Follow your  &lt;a href="http://twitter.com/grahampoulter"&gt;friends&lt;/a&gt; (all of them), and your friends will follow you as well.

2. Install a twitter-supporting app like &lt;a href="http://www.fring.com/"&gt;Fring&lt;/a&gt; on your phone.  I haven't done this because I need a new phone (Lazyweb recommendations?).

3. Go to ObzFest or other massive event.

4. Tweet "&lt;i&gt;graham:&lt;/i&gt; is at Stones for the next hour or so".  Friends phones may beep briefly to note they have new tweets.  They in turn can tweet "Joining graham at Stones", or generally post their own locations, and groups will gather naturally.

Problem solved.  Except for the little problem of getting sufficiently wide-spread technology adoption.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-3891168086892186006?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/ZjmFJqP6VTg" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2008/12/mid-obzfest-blogging.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/3891168086892186006?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/3891168086892186006?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/ZjmFJqP6VTg/mid-obzfest-blogging.html" title="Mid-ObzFest Blogging" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_rswIZalsPuc/SXO0uYstNQI/AAAAAAAABAc/18Mg5xLIVbc/s72-c/loveobs.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2008/12/mid-obzfest-blogging.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04ARXg-fyp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-4266871179431152975</id><published>2008-06-16T17:32:00.007+02:00</published><updated>2009-10-19T10:45:44.657+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:45:44.657+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><title>Why humans cannot be completely happy</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;What do humans want?  To be happy.  But what is happiness?  Happiness, apparently, is that thing which humans really want.  Ahem.  With a circular definition, it would be no wonder that people find happiness elusive.  The definition I found in Aristotle's &lt;span style="font-style: italic;"&gt;Nichomachean Ethics&lt;/span&gt; was along the lines of "the final human good, the end to which other goods are merely means", which isn't much more helpful. 

Off-topic, Aristotle's ideas have tremendous staying power in terms of influencing Western thought through to the present - despite whoppers like the idea that heavy objects fall faster than light ones (on the basis that the rightful place of all objects was at the centre of the universe, and heavy ones have a greater will do it), and the "men are rational while women are emotional" line from &lt;span style="font-style: italic;"&gt;Politics&lt;/span&gt; that has &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://feministchemists.com/2008/05/16/aristotles-sexist-legacy/"&gt;supported&lt;/a&gt; millenia &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;of sexist social structures.    It took Galileo, Kepler and Newton to untangle the former, and even the most "developed" societies haven't completely gotten over the latter.  On the other hand,&lt;span style="font-style: italic;"&gt; &lt;/span&gt;the &lt;span style="font-style: italic;"&gt;Ethics&lt;/span&gt; wasn't intended to be a philosophical treatise - it's really his lecture notes for the very first secular 'practical guide to living' course directed to the men of the Greek upper classes - two thousand-odd years before Dale Carnegie and the self-help fads.

Being more practical than most philosophers since Aristotle, psychologists helpfully use "subjective well-being" in place of "happiness".  Interestingly, in Aristotle's Nichomachean Ethics, the word translated as "happiness" is "eudaimonia", which literally means "living under a good spirit".  Subjective well-being seems a better translation in general - although it wouldn't be fully consistent with the uses of the word in the &lt;span style="font-style: italic;"&gt;Ethics&lt;/span&gt;.

Subjective well-being tells us just what it is: a state of mind.  &lt;a href="http://www.sciencemag.org/cgi/content/full/312/5782/1908"&gt;Empirical research&lt;/a&gt; bears this out: if you are asked about finances just before being asked "All things considered,&lt;sup&gt; &lt;/sup&gt;how satisfied are you with your life as a whole these days?", then priming effects makes finances weigh heavily on the judgement of overall happiness.  The same thing happens when primed with questions about one's love life, or physical health.

Hundreds of factors make up subjective well-being.  To name a few from my own brainstorming (more ideas welcome):
&lt;ul&gt;&lt;li&gt;Physical: health, exercise, nutrition, sleep, appearance&lt;/li&gt;&lt;li&gt;Personal: adventure, change, direction and goals, financial stability, personal development, relaxation, work, peace (vs anxiety)&lt;/li&gt;&lt;li&gt;Interpersonal: social activity and acceptance, peace (vs conflict), altruism, friendship, intimacy (love life), community, family&lt;/li&gt;&lt;li&gt;Intellectual: aesthetic appreciation, creative expression, intellectual exploration and engagement
&lt;/li&gt;&lt;/ul&gt;The exercise leads me to draw three conclusions: (1) human brains can't weigh up so many factors at once, so subjective well-being gets thumbsucked from whatever seems salient at the moment (easily influenced by priming), and (2) with so many factors, at least a few will be going wrong at any point in life.   Subjective well being will therefore always have room for improvement - unlike the "now I can die happy" cliche of attaining perfect happiness.   And (3) the whole thing is subjective: which factors count the most, and how much detail each one goes into (I made an entire section for "intellectual" factors, while someone else might break down "love life" or "family" into half a dozen factors each) all comes down to personal preference.  1-3 could be why perfect happiness (or maximal subjective well-being) is unnattainable in practice.

One more thought: if subjective well-being was condensed into a number and graphed over time, on reaching the end of the road there will be a maximum somewhere along the way.  But you probably won't know where it was.  On the plus side, not knowing lets you live as if the best is yet to come.

And a question: does anyone know of a "happiness test" as well founded as the &lt;a href="http://en.wikipedia.org/wiki/Big_Five_personality_traits"&gt;5-factor&lt;/a&gt; NEO PI-R "OCEAN" personality model? For personality, I recommend Dr &lt;a href="http://www.personal.psu.edu/faculty/j/5/j5j/IPIP/"&gt;John A. Johnson's formulation&lt;/a&gt; of the IPIP-NEO test, based on the NEO PI-R which is the latest step in a slow convergence amongst personality researchers for the last 70 years.  To know precisely what the factors are and which are lacking would tell one right away what is being neglected and what will be easiest to improve - thus netting the most happiness for a given amount of effort.

I'm not formally trained in philosophy or psychology, raising the chance of making some whoppers of my own in the above.  Corrections and further insights will be greatly appreciated.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/22557003-4266871179431152975?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/BJIrV6zlNKQ" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2008/06/why-humans-cannot-be-completely-happy.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/4266871179431152975?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/4266871179431152975?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/BJIrV6zlNKQ/why-humans-cannot-be-completely-happy.html" title="Why humans cannot be completely happy" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2008/06/why-humans-cannot-be-completely-happy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQFSXY4eSp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-1571709645173843063</id><published>2008-06-05T18:23:00.002+02:00</published><updated>2009-10-19T10:51:58.831+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:51:58.831+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="journal" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="fail" /><title>Dentistry and fillings</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
Six fillings.  I was surprised too, considering that I've had only one filling previously, and most of my dentists' comments on my every-two-years checkups have been along the lines of "I wish I had teeth like yours".  The X-ray the week before had even showed that at 25 I have no wisdom teeth whatsoever, which is a money-saving &lt;a href="http://www.newscientist.com/article/dn13927-five-things-humans-no-longer-need.html?DCMP=ILC-tabView&amp;amp;nsref=dn13927"&gt;genetic polymorphism&lt;/a&gt; last seen in one of my great grandparents.&lt;br /&gt;
&lt;br /&gt;
At my checkup the week before the oral hygienist noted "some minor cavitation", and in the mirror I saw 2-3 dark patches on the molars.   She called in the dentist and read out a long list of alphabet soup while he poked the corresponding locations with the dental explorer.  Nonetheless, I was surprised on Monday to discover that there were six fillings to be done, on &lt;a href="http://www.dentalimplants-usa.com/Generalinfo/toothnumbering.html"&gt;tooth numbers&lt;/a&gt; 26 OP, 27 OP, 17 OP, 16 OP, 47 O and 46 B (O=occlusal or biting surface, B=buccal or cheeck side, P=palatal or towards the palate), and the oral hygienest confirmed these were the ones.   The fillings themselves were mostly-painless, and used a modern light-cured dental composite, where a bright blue light drives a polymerisation reaction, turning the filling putty into a hard tooth-coloured substance.  Acid-etching beforehand gives the composite a micromechanical bond to the enamel and dentine, so the filling is pretty much one with the tooth.&lt;br /&gt;
&lt;br /&gt;
After I left I wondered - how many of the fillings were really necessary?  Some could have been reversible demineralised regions or incipient decay being filled preventively, rather than real cavities.  Preventive dentistry isn't necessarily the best route, since fillings don't last forever (although 10+ years is usual on modern composites, even on molars), and they can go wrong rapidly if a leak occurs that allows bacteria inside.  Fillings really do need the &lt;i&gt;6-month &lt;/i&gt;checkups they always tell you to have, because if a leak goes undetected you could find yourself needing a root canal.   Seems I'm in for a lot of checkups over the rest of my life.&lt;br /&gt;
&lt;br /&gt;
I read up and found that &lt;a href="http://www.dentalfearcentral.org/unnecessary_treatment.html"&gt;unnecessary treatment&lt;/a&gt; is common, but after the filling all evidence of what was there before is gone.  What you are supposed to do is ask the dentist, at the checkup, to show you each site of proposed filling one at a time.  If there is no visible cavity, there should be a good explanation (e.g. interproximal cavities may show only on X-rays). &lt;br /&gt;
&lt;br /&gt;
If the dentist says "it is likely to be come a cavity", then you are better off taking it as a warning to modify your oral hygeine and diet rather than getting a filling.   I think my problem was that October through February I got into a habit of eating chocolate on campus, at a rate of about 1 square per hour or two.  Because my tooth-brushing and flossing habits were fine and I'd never had problems before, it never occured to me that adding a few squares of chocolate to my diet would cause cavities.   As it turns out, prolonged sugar levels in the mouth feed acid-producing bacteria, which demineralise the tooth enamel, eventually forming cavities.   Rather than brushing during the day, you're supposed to rinse your mouth with water to remove sugars and particles before they feed the bacteria: but that doesn't work with chocolate, toffee or other  things which stick to your teeth.&lt;br /&gt;
&lt;br /&gt;
So, don't snack on sticky sweet things between meals (fruit may be ok because fibres remove bacteria and aren't sticky), drink water after eating things, wait 10-20 minutes before brushing to soften particles stuck in your molars, brush carefully morning and evening after meals with a non-frayed toothbrush, and floss daily before brushing.   That's the comprehensive diet-and-hygiene way to avoid getting (more) cavities.&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/22557003-1571709645173843063?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/tanpLulHrBk" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2008/06/dentistry-and-fillings.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/1571709645173843063?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/1571709645173843063?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/tanpLulHrBk/dentistry-and-fillings.html" title="Dentistry and fillings" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2008/06/dentistry-and-fillings.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04ARXg-cCp7ImA9WxNWGUk.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-7172746432031495087</id><published>2008-05-26T19:00:00.000+02:00</published><updated>2009-10-19T10:45:44.658+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T10:45:44.658+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><title>Thinking about retirement</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I've read a bit about retirement annuities (RAs) on &lt;a href='http://www.persfin.co.za/index.php?fArticleId=4016381&amp;amp;fSectionId=712&amp;amp;amp;fSetId=300'&gt;Personal Finance&lt;/a&gt;.  I've never bought one, but picked up a couple of interesting things.&lt;br/&gt;&lt;br/&gt;The good: asset management companies offer low-cost RAs that resemble prudentially managed unit trusts (i.e. 75% equities, rest in bonds or cash) that you can put up to 15% of your income into before tax, grow it nicely, then take it out at low tax after your retire.   Allan Gray, Coronation, Investec are asset managers that offer RAs (know of others?).  These asset managers introduced their RA's in response to the life assurers' RAs being shown up as rip-offs in 2005.  Assurers like Old Mutual, Momentum and Sanlam still offer things that eat 5.7% of your money before it even gets invested, and Sanlam Private Investment is even worse.  The life assurers also offer all manner of complex insurance-annuity products that &lt;i&gt;really&lt;/i&gt; eat your money, especially if you stop putting money in for whatever reason.  An RA should be an asset not a policy: go with the pro's.&lt;br/&gt;&lt;br/&gt;Asset managers allow one to move to a competitor's RA, and won't charge for leaving - as with unit trusts.  Like unit trusts, one can invest "as and when" one pleases, and stop the debit order without consequences.  By contrast, the fine print of Old Mutual et al will tell you you're stuck with them for life, and the Max "committed" products force you to maintain monthly payments for 10 years (skipping no more than 6 payments) or face stiff penalties.  Try to switch to another RA, and you'll take a stiff penalty because about almost a year's worth of payments are actually commission to an advisor and are being paid off in the &lt;a href='http://www.persfin.co.za/index.php?fArticleId=2961317&amp;amp;fSectionId=712&amp;amp;amp;fSetId=300'&gt;form of a 10-year loan&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;If there's any uncertainty about investing for retirement, find a certified financial advisor (CFA) that charges hourly rates - instead of one that takes up to 3% upfront, and up to 1% a year thereafter.  Failing hourly rates, negotiate a fixed, product-independent fee and have it doled out over the lifespan of the product.  The people who deserve a percentage cut of the assets are the ones managing them on a day to day basis: the asset management company.  Product-associated commissions to CFAs do provide an incentive to the CFAs, the incentive to &lt;a href='http://www.fin24.com/articles/default/display_article.aspx?ArticleId=1518-24_2281178'&gt;track down the highest-commission products and trick you into buying them&lt;/a&gt;.  To their credit, Liberty Life introduced an RA last year that paid advisor commissions half-upfront and half over the life of the product in anticipation of upcoming government regulation to stop CFAs receiving their commision over just the first two years (after which they give poor service or convince you switch to a new product for fresh commissions) - and received far fewer investments because of it.&lt;br/&gt;&lt;br/&gt;People on a company pension fund, on leaving, can move either to an RA or a preservation fund.   With preservation funds the "years of membership" (used to give a tax free amount at the end) include the years with the pension, while with moving to an RAs the count is reset to zero, for a slight tax disadvantage.  Preservation funds can later be moved to a new employer's pension too.  With an RA however one can make further investments by debit order, whereas the only way to put money into a preservation fund is the lump sum transfer from a company pension.&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/22557003-7172746432031495087?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/SoGyc-j3BEM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2008/05/thinking-about-retirement.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7172746432031495087?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/7172746432031495087?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/SoGyc-j3BEM/thinking-about-retirement.html" title="Thinking about retirement" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2008/05/thinking-about-retirement.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4ARXw8eip7ImA9WxNVGU4.&quot;"><id>tag:blogger.com,1999:blog-22557003.post-4750939478661210539</id><published>2008-05-23T11:48:00.004+02:00</published><updated>2009-10-30T23:25:44.272+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-30T23:25:44.272+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="capetown" /><category scheme="http://www.blogger.com/atom/ns#" term="journal" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>Cape Town Salsa</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div style=""&gt;Cape Town has become Salsa city since it got going in 2005 - and I only found out about it last week!  There are Salsa lessons (close-body variety which takes less floor space) at several venues around the peninsula every night of the week, and parties as well.  Well - every lesson turns into a Salsa party afterwards. I ran into the Salsa crowd at Mojo's Prohibition Party on Saturday, watched some advanced classes on Tuesday, and Max gave me a lift last night to the classes in town at Velvet and Deluxe last night.

Velvet lives up to its name with the roof above the bar looking like a giant cushion.   I went to Jon Morrisons' beginners class at seven, with about 25 men and 35 women.  Beginners class starts with a warm up, teaches the basic step, then practicing a move, warm-down, and social dancing till the next class.  The beginners pattern could get old fast: Reegan's class at Delux instead ran in parallel (multiple instructors) and have an "improvers" section between beginners and intermediate where you don't have to go start with the basic step every lesson and learn two moves instead of one.

It's dancefloor etiquette to introduce yourself to each new dance partner, although there's just a few minutes before the instructor says "Ladies, move 4 men to the left!"  However one ends up dancing with several of the girls twice, and are likely see them at future lessons and parties, so it helps to remember names.  Method that works for me: be sure of having heard the person's name right, then pick out distinguishing features: even non-flattering ones like heavy make-up or (rare, most ladies took care in their appearance) unplucked eyebrows.  Having a picture rather than just recognising her face, one then adds visual associations to her name and anything else like line of work.  Sofi with the braids (sitting on a sofa), Marina all in black (at Mariner's Wharf), Mimetta with bright blue eyes (and antennae), Karina with the big smile (with a the star Eta Carinae behind her head) and so forth.   Recognising the face brings the features to mind, which call up the image, which has associations to the name.
&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/22557003-4750939478661210539?l=blog.grahampoulter.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/grahampoulter/~4/10HceVP0OfI" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://blog.grahampoulter.com/2008/05/cape-town-salsa.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/4750939478661210539?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/22557003/posts/default/4750939478661210539?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/grahampoulter/~3/10HceVP0OfI/cape-town-salsa.html" title="Cape Town Salsa" /><author><name>Graham</name><uri>http://www.blogger.com/profile/16072516650932490004</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16429251115409892096" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.grahampoulter.com/2008/05/cape-town-salsa.html</feedburner:origLink></entry></feed>
