<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/>
  <title>Clug Park-Tech</title>
  <updated>2010-03-21T20:05:52Z</updated>
  <generator uri="http://intertwingly.net/code/venus/">Venus</generator>
  <author>
    <name>CLUG Webmasters</name>
    <email>webmaster@clug.org.za</email>
  </author>
  <id>http://park.clug.org.za/tech/atom.xml</id>
  <link href="http://park.clug.org.za/tech/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://park.clug.org.za/tech/" rel="alternate"/>

  <entry xml:lang="en">
    <id>http://mithrandi.net/blog/?p=248</id>
    <link href="http://mithrandi.net/blog/2010/03/capitalist-what/" rel="alternate" type="text/html"/>
    <link href="http://mithrandi.net/blog/2010/03/capitalist-what/#comments" rel="replies" type="text/html"/>
    <link href="http://mithrandi.net/blog/2010/03/capitalist-what/feed/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Tristan Seligmann (mithrandi): Capitalist what?</title>
    <summary xml:lang="en">For some reason that I cannot fathom, I am currently #9 on a Google search for capitalist pigs, and #7 for “capitalist pigs”. I first noticed this a couple of weeks back, but I now find that Google searches for capitalist pigs are the leading source of visits to this blog. WTF? I’m guessing that [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>For some reason that I cannot fathom, I am currently #9 on a Google search for <a href="http://www.google.com/search?q=capitalist+pigs">capitalist pigs</a>, and #7 for <a href="http://www.google.com/search?q=%22capitalist+pigs%22">“capitalist pigs”</a>. I first noticed this a couple of weeks back, but I now find that Google searches for capitalist pigs are the leading source of visits to this blog. WTF? I’m guessing that someone googlebombed me using another URL that redirects to my website; anyone have any ideas how to track this down? I honestly don’t really care about it, except now I’m so damned curious that I’m about to die of curiosity.</p></div>
    </content>
    <updated>2010-03-12T14:50:38Z</updated>
    <published>2010-03-12T14:49:31Z</published>
    <category scheme="http://mithrandi.net/blog" term="Uncategorized"/>
    <category scheme="http://mithrandi.net/blog" term="blog"/>
    <category scheme="http://mithrandi.net/blog" term="google"/>
    <author>
      <name>mithrandi</name>
      <uri>http://mithrandi.net/</uri>
    </author>
    <source>
      <id>http://mithrandi.net/blog/feed/</id>
      <link href="http://mithrandi.net/blog" rel="alternate" type="text/html"/>
      <link href="http://mithrandi.net/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com" rel="hub" type="text/html"/>
      <link href="http://superfeedr.com/hubbub" rel="hub" type="text/html"/>
      <subtitle xml:lang="en">the shards of meaning</subtitle>
      <title xml:lang="en">Shattered Crystalline Matrix</title>
      <updated>2010-03-12T14:50:38Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://michael.gorven.za.net/blog/2010/03/10/ibid-finally-released</id>
    <link href="http://michael.gorven.za.net/blog/2010/03/10/ibid-finally-released" rel="alternate" type="text/html"/>
    <title>Michael Gorven (cocooncrash): Ibid finally released!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>After over a year of development, we have finally released <a href="http://ibid.omnia.za.net/">Ibid</a>. Ibid is a general purpose chat bot written in Python. We've suffered from a bit of feature creep, so despite being a 0.1 release it can talk 7 messaging protocols and has over 100 features provided by plugins. I think we also have an excellent architecture and very developer friendly plugin API. The <a href="https://launchpad.net/ibid/+milestone/0.1.0">0.1.0</a> release can be <a href="https://launchpad.net/ibid/+download">downloaded</a> from <a href="https://launchpad.net/ibid">Launchpad</a> or installed from our <a href="https://launchpad.net/~ibid-core/+archive/ppa">PPA</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>After over a year of development, we have finally released <a href="http://ibid.omnia.za.net/">Ibid</a>. Ibid is a general purpose chat bot written in Python. We've suffered from a bit of feature creep, so despite being a 0.1 release it can talk 7 messaging protocols and has over 100 features provided by plugins. I think we also have an excellent architecture and very developer friendly plugin API. The <a href="https://launchpad.net/ibid/+milestone/0.1.0">0.1.0</a> release can be <a href="https://launchpad.net/ibid/+download">downloaded</a> from <a href="https://launchpad.net/ibid">Launchpad</a> or installed from our <a href="https://launchpad.net/~ibid-core/+archive/ppa">PPA</a>.</p></div>
    </content>
    <updated>2010-03-10T10:08:51Z</updated>
    <published>2010-03-10T10:07:09Z</published>
    <category term="bots"/>
    <category term="code"/>
    <category term="ibid"/>
    <category term="irc"/>
    <category term="jabber"/>
    <category term="python"/>
    <category term="technical"/>
    <author>
      <name>mgorven</name>
    </author>
    <source>
      <id>http://michael.gorven.za.net/taxonomy/term/3/atom/feed</id>
      <link href="http://michael.gorven.za.net/tags/technical" rel="alternate" type="text/html"/>
      <link href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed" rel="self" type="application/atom+xml"/>
      <subtitle>Posts containing technical information.</subtitle>
      <title>technical</title>
      <updated>2008-10-01T15:12:23Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://mithrandi.net/blog/?p=246</id>
    <link href="http://mithrandi.net/blog/2010/03/steam-fail/" rel="alternate" type="text/html"/>
    <link href="http://mithrandi.net/blog/2010/03/steam-fail/#comments" rel="replies" type="text/html"/>
    <link href="http://mithrandi.net/blog/2010/03/steam-fail/feed/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Tristan Seligmann (mithrandi): Steam Fail</title>
    <summary xml:lang="en">So… I can buy the package for $11.99, or just buy the individual games for $9.98. WTF?</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://mithrandi.net/blog/wp-content/uploads/2010/03/steam-fail.png"><img alt="" class="aligncenter size-full wp-image-245" height="367" src="http://mithrandi.net/blog/wp-content/uploads/2010/03/steam-fail.png" title="steam-fail" width="498"/></a></p>
<p>So… I can buy the package for $11.99, or just buy the individual games for $9.98. WTF?</p></div>
    </content>
    <updated>2010-03-09T01:30:43Z</updated>
    <published>2010-03-09T01:30:43Z</published>
    <category scheme="http://mithrandi.net/blog" term="Uncategorized"/>
    <category scheme="http://mithrandi.net/blog" term="fail"/>
    <category scheme="http://mithrandi.net/blog" term="steam"/>
    <category scheme="http://mithrandi.net/blog" term="wtf"/>
    <author>
      <name>mithrandi</name>
      <uri>http://mithrandi.net/</uri>
    </author>
    <source>
      <id>http://mithrandi.net/blog/feed/</id>
      <link href="http://mithrandi.net/blog" rel="alternate" type="text/html"/>
      <link href="http://mithrandi.net/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com" rel="hub" type="text/html"/>
      <link href="http://superfeedr.com/hubbub" rel="hub" type="text/html"/>
      <subtitle xml:lang="en">the shards of meaning</subtitle>
      <title xml:lang="en">Shattered Crystalline Matrix</title>
      <updated>2010-03-12T14:50:38Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://mithrandi.net/blog/?p=240</id>
    <link href="http://mithrandi.net/blog/2010/03/last/" rel="alternate" type="text/html"/>
    <link href="http://mithrandi.net/blog/2010/03/last/#comments" rel="replies" type="text/html"/>
    <link href="http://mithrandi.net/blog/2010/03/last/feed/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Tristan Seligmann (mithrandi): Last</title>
    <summary xml:lang="en">This isn’t meant to last,
this is for right now.
— Nine Inch Nails, Last
Spent several hours this morning importing my old old blog posts into Wordpress; the import is now complete. Early on in the life of the blog, I began generating an Atom feed directly from my hand-written XHTML; later on, I changed my markup [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><blockquote><p>This isn’t meant to last,<br/>
this is for right now.<br/>
— Nine Inch Nails, <em>Last</em></p></blockquote>
<p>Spent several hours this morning importing my old old blog posts into Wordpress; the import is now complete. Early on in the life of the blog, I began <a href="http://mithrandi.net/blog/2005/06/atom-feed-now-available/">generating an Atom feed</a> directly from my hand-written XHTML; later on, I changed my markup to use the <a href="http://microformats.org/wiki/hatom">hAtom</a> microformat, and ditched my custom transform in favour of <a href="http://rbach.priv.at/Microformats/hAtom2Atom/">hAtom2Atom</a>. I used this again to run a conversion over each month’s posts, although I had to edit the oldest into hAtom form since they were using a custom class schema; just a trivial matter of assigning the correct classes. I then had to remove the doctype declaration from each page, because Saxon was failing to fetch the XHTMTL 1.1 DTD for some reason; since the DTD was completely unnecessary for this transform, I decided it would be easier to just ditch it.</p>
<p>Now that I had the ability to generate an Atom feed for each page, the next trick was importing this into Wordpress somehow. Wordpress supports importing an RSS 2.0 feed, so I tracked down another transform to convert the Atom to RSS 2.0: <a href="http://atom.geekhood.net/">atom2rss-exslt.xsl</a>. After hacking it slightly to run on Saxon 6 (the decode-uri function detection doesn’t work, since it checks for a later version of the Saxon processor), I had what looked like good RSS 2.0 output, which I imported. Unfortunately, this didn’t work out so well; the tags weren’t imported, and Wordpress inserts a &lt;br&gt; tag for each newline; since the output of the transform had a bunch of extraneous newlines, this meant that my posts were now littered with extraneous line breaks. I edited the transform to get rid of the newlines, but still wasn’t very happy with this.</p>
<p>So… plan B! Wordpress has an import/export format called Wordpress eXtended RSS; basically, RSS 2.0 plus a whole whack of custom Wordpress extension elements. I spent around an hour hacking the transform to generate WXR output. This was even more painful than it sounds; for example, encoded content is “supported” by stripping any CDATA section start/end markers, and then importing the content as-is. Even if there <em>wasn’t</em> a CDATA section. I guess they only care about reading their own output.</p>
<p>As a final touch, I hacked the transform a little more to insert an invisible anchor tag at the beginning of each post so that even my <a href="http://mithrandi.net/blog/2005/06#d06t2140">old permalinks</a> will work. This was fortunately quite easy to do, since my old URL scheme was year/month, which happens to be supported by Wordpress too; I just needed the anchors so that you would get taken to the correct post.</p></div>
    </content>
    <updated>2010-03-09T01:19:02Z</updated>
    <published>2010-03-09T01:19:02Z</published>
    <category scheme="http://mithrandi.net/blog" term="Uncategorized"/>
    <category scheme="http://mithrandi.net/blog" term="atom"/>
    <category scheme="http://mithrandi.net/blog" term="blog"/>
    <category scheme="http://mithrandi.net/blog" term="hAtom"/>
    <category scheme="http://mithrandi.net/blog" term="tech"/>
    <category scheme="http://mithrandi.net/blog" term="wordpress"/>
    <category scheme="http://mithrandi.net/blog" term="wxr"/>
    <category scheme="http://mithrandi.net/blog" term="xslt"/>
    <author>
      <name>mithrandi</name>
      <uri>http://mithrandi.net/</uri>
    </author>
    <source>
      <id>http://mithrandi.net/blog/feed/</id>
      <link href="http://mithrandi.net/blog" rel="alternate" type="text/html"/>
      <link href="http://mithrandi.net/blog/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com" rel="hub" type="text/html"/>
      <link href="http://superfeedr.com/hubbub" rel="hub" type="text/html"/>
      <subtitle xml:lang="en">the shards of meaning</subtitle>
      <title xml:lang="en">Shattered Crystalline Matrix</title>
      <updated>2010-03-12T14:50:38Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jonathancarter.co.za/?p=1126</id>
    <link href="http://jonathancarter.co.za/2010/02/23/happy-birthday-apache-http-server/" rel="alternate" type="text/html"/>
    <title>Jonathan Carter (highvoltage): Happy Birthday, Apache HTTP Server!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><br/>
Today marks the birthday of one of my favourite free software projects and software, the Apache HTTP server.  Why do I like it? It’s well supported on many platforms, well documented and it’s one of those pieces of software that almost never really gives me any hassles and does what it promises too. It was also one [...]</div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><br/><p style="text-align: center;"><img alt="" class="size-full wp-image-1127 aligncenter" height="106" src="http://jonathancarter.co.za/files/images/apachelogo.png" title="apachelogo" width="351"/></p>
<p>Today marks the birthday of one of my favourite free software projects and software, the <a href="http://en.wikipedia.org/wiki/Apache_HTTP_Server">Apache HTTP server</a>.  Why do I like it? It’s well supported on many platforms, well documented and it’s one of those pieces of software that almost never really gives me any hassles and does what it promises too. It was also one of the <a href="http://en.wikipedia.org/wiki/Killer_application">killer apps</a> that drove <a href="http://en.wikipedia.org/wiki/Linux_adoption">Linux adoption</a> in the early days before it had as many uses as it has today.</p>
<p>The <a href="http://blogs.apache.org/foundation/entry/the_apache_software_foundation_announces2">Apache Foundation blog has a great entry</a> on this birthday and the project’s history, detailing out some important dates and also memes that are now widely used in free software communities pretty much everywhere, for example, the -1/+0/+1 voting style was established by the Apache community that people in the Ubuntu community for one would be familiar with. Talking of <a href="http://en.wikipedia.org/wiki/Ubuntu_(operating_system)">Ubuntu</a>, <a href="http://en.wikipedia.org/wiki/Mark_Shuttleworth">Mark Shuttleworth</a> who founded the project was also the first person to package and <a href="https://wiki.edubuntu.org/MarkShuttleworth#Why are you funding Ubuntu, instead of giving the money to Debian?">maintain the Apache server packages</a> in <a href="http://en.wikipedia.org/wiki/Debian">Debian</a>. Today Debian (and its derivatives) is one of the greatest systems to run Apache on, especially since it’s configuration makes it so easy to drop in additional configuration using tools such as Puppet and also the Debian’s packaging system.</p>
<p>Happy 15h’th birthday Apache and thanks for all the years of great software so far!</p></div>
    </content>
    <updated>2010-02-23T17:30:13Z</updated>
    <category term="Free Software"/>
    <category term="Apache"/>
    <category term="Apache Foundation"/>
    <category term="httpd"/>
    <category term="Killer Apps"/>
    <category term="Linux"/>
    <author>
      <name>jonathan</name>
    </author>
    <source>
      <id>http://jonathancarter.co.za</id>
      <link href="http://jonathancarter.co.za/category/free-software/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jonathancarter.co.za" rel="alternate" type="text/html"/>
      <subtitle>rebel without a pause</subtitle>
      <title>jonathan carter » Free Software</title>
      <updated>2010-02-23T18:05:53Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://morgancollett.wordpress.com/?p=190</id>
    <link href="http://morgancollett.wordpress.com/2010/02/05/betavine-cape-town-developer-day-2010/" rel="alternate" type="text/html"/>
    <link href="http://morgancollett.wordpress.com/2010/02/05/betavine-cape-town-developer-day-2010/#comments" rel="replies" type="text/html"/>
    <link href="http://morgancollett.wordpress.com/2010/02/05/betavine-cape-town-developer-day-2010/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Morgan Collett (morgs): Betavine Cape Town Developer Day 2010</title>
    <summary type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">I used to work for OLPC, whose mission is to distribute low cost laptops for education, without necessarily the connectivity with the outside world. Now at Praekelt we’re focusing on using connectivity as the power – harnessing the deployed base of mobile phones in Africa without requiring them to be smartphones or computing devices. As [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morgancollett.wordpress.com&amp;blog=494363&amp;post=190&amp;subd=morgancollett&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I used to work for <a href="http://www.laptop.org/">OLPC</a>, whose mission is to distribute low cost laptops for education, without necessarily the connectivity with the outside world. Now at Praekelt we’re focusing on using connectivity as the power – harnessing the deployed base of mobile phones in Africa without requiring them to be smartphones or computing devices. As part of this <a href="http://www.praekeltfoundation.org/">Praekelt Foundation</a> and Vodacom are hosting the <a href="http://capetowndevday.eventbrite.com/">Betavine Social Exchange Cape Town Developer Day 2010</a>.</p>
<p>I’ve asked Steve Wolak to tell us more about <a href="http://www.betavine.net/">Betavine</a> and the event.<br/>
<strong><br/>
Who is Steve Wolak?</strong></p>
<p><img alt="" class="alignleft" height="117" src="http://www.betavine.net/betavine-content/images/homepage/promos/steve.gif" title="Steve Wolak" width="118"/>Stephen Wolak, Founder and Head of Betavine, has worked in mobile technology and software since graduating from Imperial College, London. Stephen joined Vodafone Group R&amp;D in 2000 and in 2006 put forward the idea of an open platform for engaging the wider technology community with R&amp;D activities.  The rest, as they say, is history.</p>
<p><strong>MC: I first became aware of Betavine when looking for 3G drivers for Linux, but I’m sure there is more to it than that. What is Betavine and how did it start?</strong></p>
<p>SW: Betavine was launched in January 2007 and has been evolving ever since, with new features being added in response to new requirements and feedback from the user base.  One area of success has been the linux software for the Vodafone Mobile Connect (VMC) card which has been downloaded over 750,000 times and has created a lively community around it.</p>
<p>We have also run a number of successful competitions on the website and created a lively Widget Zone. The website continues to evolve and we try out new things.</p>
<p><strong>MC: What is the Betavine Social Exchange?<br/>
</strong></p>
<p>SW: This is our latest idea.. creating “social and sustainable” mobile solutions.  The Betavine Social Exchange seeks to bring together 3 communities; the mobile community, the social sector and the entrepreuners.  Together these communities can create mobile solutions for the social sector.  Community organisations create challenges on the website and mobile developers / social entrepreneurs create solutions. The website then supports the deployment of these solutions on the ground.</p>
<p><strong>MC: The BSX’s success certainly depends on connecting the right people: those with needs – the NGOs and community organisations – and the developers. How do you publicise the BSX to reach them?<br/>
</strong></p>
<p>SW: We are running our pilot in South Africa and so we are working with Sangonet to help us get in touch with South African NGOs.  We are running a <a href="http://capetowndevday.eventbrite.com/">developer day in Cape Town</a> to help us engage with the local developer community.<br/>
<strong><br/>
MC: What do the resulting solutions include – are they apps for mobile phones, mobi websites, SMS solutions or all of the above?</strong></p>
<p>SW: All of the above.  It is important that the solution is appropriate for the challenge and the local community that will ultimately use the solution.</p>
<p><strong>MC: What can developers expect from participating in the BSX?</strong></p>
<p>SW: They can find real world challenges that people are seeking solutions to.  They can meet other developers and find useful resources to help them create a business.  The full resources section is coming soon.</p>
<p><strong>MC: Which leads us on to the Developer Day being hosted in Cape Town next month. What’s going to be happening at the event, and how does it tie in with the BSX?</strong></p>
<p>SW: We are keen to encourage mobile developers based in South Africa to engage with the real challenges that have been posted on the Betavine Social Exchange.  The developer day will include presentations on mobile technology and some exciting mobile solutions plus a developer competition and lots of creative energy and networking.</p>
<p><strong>MC: You’re going to be speaking at the event. Who would you like to see there?<br/>
</strong></p>
<p>SW: I would like to see mobile developers plus those with design skills and a passion for using mobile technology for social change.</p>
<p><strong>MC: We’re having a developer competition on the day. Can you tell us anything about the prizes/incentives you’re planning to bring?</strong></p>
<p>SW: Well, the developer day is free and includes lots of food and drink plus some beer at the end of the day … :-)  We also intend to offer a few prizes for the competition winners .. But we have not decided exactly what yet.  You will have to come along and see but tickets are going fast!</p>
<p><strong>Developer Day details<br/>
</strong></p>
<p>Date: Wednesday, March 10, 2010 from 9:30 AM – 7:00 PM</p>
<p>Location: <a href="http://www.lightbox.co.za/">The Lightbox Daylight Studio</a>, Green Point, Cape Town</p>
<p>More information and free tickets are available at <a href="http://capetowndevday.eventbrite.com/">eventbrite</a>. Due to the demand, the event has been expanded to 70 people.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/morgancollett.wordpress.com/190/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morgancollett.wordpress.com/190/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/morgancollett.wordpress.com/190/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/morgancollett.wordpress.com/190/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/morgancollett.wordpress.com/190/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/morgancollett.wordpress.com/190/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/morgancollett.wordpress.com/190/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/morgancollett.wordpress.com/190/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/morgancollett.wordpress.com/190/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/morgancollett.wordpress.com/190/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morgancollett.wordpress.com&amp;blog=494363&amp;post=190&amp;subd=morgancollett&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2010-02-05T12:13:51Z</updated>
    <published>2010-02-05T12:13:51Z</published>
    <category scheme="http://morgancollett.wordpress.com" term="open source"/>
    <category scheme="http://morgancollett.wordpress.com" term="south africa"/>
    <category scheme="http://morgancollett.wordpress.com" term="ubuntu"/>
    <author>
      <name>Morgan</name>
      <uri>http://morgancollett.wordpress.com/</uri>
    </author>
    <source>
      <id>http://morgancollett.wordpress.com/feed/atom/</id>
      <link href="http://morgancollett.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://wordpress.com/opensearch.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://morgancollett.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://feeds.feedburner.com/FeedingThePenguins" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle xml:lang="en">Thoughts of an Ubunut</subtitle>
      <title xml:lang="en">Feeding the Penguins</title>
      <updated>2010-02-05T12:13:51Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://www.bloggroll.com/view/17</id>
    <link href="http://www.bloggroll.com/view/ipoo-announcement" rel="alternate" type="text/html"/>
    <title>Jonathan Groll (eyesonly): Crapple "release" the iPoo</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img alt="" src="http://www.bloggroll.com/stat/tamagotyou.jpg"/></p>
<p><span class="caps">CUPOOTINO</span>, California. Steven Jobless, <span class="caps">CEO</span> of Crapple Corp, announced his company’s long awaited tablet form-factor machine last Wednesday. Whilst sequestered in the backwoods of Tennessee last year, Mr Jobless spent a lot of time waiting for medical test results and considering the meaning of life. Whereupon he had what he described as a “number 1 experience”. It hit him – the perfect Captive Market. The new product, marketed as the iPoo is of the ideal form factor for use whilst positioned on the lavatory. Unlike the early tablet products produced by their competitors, the iPoo is not a fully fledged compooter, but follows the <a href="http://www.asktog.com/papers/raskinintuit.html">Jeff Raskin school of thought</a> on what constitutes a suitable “Intuitive Interface” for the average user.</p><p>Marketing of the new product is intended to involve heavy use of anti-social media – each geek on the planet is forced into deciding whether they would buy the device or not. Since most of them think it’ll be shit, it’ll count as a ringing endorsement for the non-tech savvy public. It seems that the geek public is waiting for the next shitteration of the device.</p>
<p>Taking full advantage of the <span class="caps">DRM</span> the product provides, it comes in two models. The slightly more expensive option, “Comes with Porn” (seemingly aimed at competitor Noklue) unlocks <span class="caps">DRM</span> for porn on the device, and also uses a new technology known only as “3D-multitouch” (details not yet provided at time of going to press).</p>
<p>We spent some time after the media announcement assessing the mood amongst the company faithful, and by and large that mood was one of “Relief”. Reaction amongst the Linux community was less positive, with comments ranging from “We invented Brown” (Ubuntu’s <a href="http://www.markshuttleworth.com/">Mark Shuttleworth</a>), “We invented shit-casting” (Communitization manager, <a href="http://www.jonobacon.org/">Jono Bacon</a>) to “It’s Crap” (Fabian Scherschel, from the <a href="http://linuxoutlaws.com/">Linuxoutlaws</a>).</p></div>
    </summary>
    <updated>2010-02-03T12:59:58Z</updated>
    <source>
      <id>http://www.bloggroll.com/</id>
      <author>
        <name>Jonathan Groll (eyesonly)</name>
      </author>
      <link href="http://www.bloggroll.com/" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/BloggrollTech" rel="self" type="application/rss+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>The webshite of Jonathan Groll</subtitle>
      <title>The Bloggroll</title>
      <updated>2010-02-18T00:05:52Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jonathancarter.co.za/?p=1116</id>
    <link href="http://jonathancarter.co.za/2010/01/29/ltsp-cluster-website/" rel="alternate" type="text/html"/>
    <title>Jonathan Carter (highvoltage): LTSP Cluster Website</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><br/>For the past few months I’ve been working on the LTSP-Cluster team at Revolution Linux. Today we’re releasing the website so that we can tell the world what we’ve been doing!

LTSP-Cluster is a set of tools and plugins for LTSP that allows you to extend LTSP so that it can scale up to hundreds of [...]</div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><br/><p>For the past few months I’ve been working on the <a href="http://ltsp-cluster.com">LTSP-Cluster</a> team at <a href="http://revolutionlinux.com">Revolution Linux</a>. Today we’re releasing the website so that we can tell the world what we’ve been doing!</p>
<p><a href="http://ltsp-cluster.com"><img alt="" class="alignnone size-full wp-image-1119" height="347" src="http://jonathancarter.co.za/files/images/ltsp-cluster-website1.jpg" title="ltsp-cluster-website" width="585"/></a></p>
<p>LTSP-Cluster is a set of tools and plugins for <a href="http://ltsp.org">LTSP</a> that allows you to extend LTSP so that it can scale up to hundreds of servers and thousands of LTSP clients. It has a nice web interface for your LTSP configuration, does load balancing between your servers and more. It can even connect your LTSP thin client to a cluster of <a href="http://en.wikipedia.org/wiki/Microsoft_Windows">Windows</a> terminal servers or <a href="http://en.wikipedia.org/wiki/NX_technology">NX</a> servers, if you’re into that sort of thing. If you’re deploying LTSP soon, you’d probably want to investigate LTSP-Cluster, and I’m not just saying it because I’m involved in the project <img alt=":)" class="wp-smiley" src="http://jonathancarter.co.za/wp-includes/images/smilies/icon_smile.gif"/> </p>
<p>It’s licensed under the <a href="http://en.wikipedia.org/wiki/GNU_General_Public_License">GPLv3</a> license and supported by the LTSP community, you can also get commercial support <strong>*wink* *wink*</strong> from <a href="http://revolutionlinux.com">Revolution Linux</a> where plenty of very skilled people are ready for your LTSP related needs.</p></div>
    </content>
    <updated>2010-01-28T22:54:32Z</updated>
    <category term="Free Software"/>
    <category term="LTSP"/>
    <category term="LTSP Cluster"/>
    <category term="NX"/>
    <category term="Revolution Linux"/>
    <category term="Windows"/>
    <author>
      <name>jonathan</name>
    </author>
    <source>
      <id>http://jonathancarter.co.za</id>
      <link href="http://jonathancarter.co.za/category/free-software/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jonathancarter.co.za" rel="alternate" type="text/html"/>
      <subtitle>rebel without a pause</subtitle>
      <title>jonathan carter » Free Software</title>
      <updated>2010-02-23T18:05:54Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jonathancarter.co.za/?p=1111</id>
    <link href="http://jonathancarter.co.za/2010/01/18/edubuntu-wiki-hug-day/" rel="alternate" type="text/html"/>
    <title>Jonathan Carter (highvoltage): Edubuntu Wiki Hug Day</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><br/>
As Scott posted before, the Edubuntu Bug day went quite well last week. This coming Thursday (21 January) we’re doing a Wiki Hug Day to to focus our efforts on fixing things in the Edubuntu wiki namespace, it includes:

Fixing broken links
Removing horribly obsolete or broken pages
Moving pages which are in the wrong place
Prettifying pages
Mark pages [...]</div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><br/><p><a href="http://jonathancarter.co.za/files/images/edubuntuwikiday.jpg"><img alt="" class="alignnone size-full wp-image-1112" height="330" src="http://jonathancarter.co.za/files/images/edubuntuwikiday.jpg" title="edubuntuwikiday" width="300"/></a></p>
<p>As <a href="http://ltspthinclient.blogspot.com/2010/01/edubuntu-bug-day-redux.html">Scott posted before</a>, the Edubuntu Bug day went quite well last week. This coming Thursday (21 January) we’re doing a Wiki Hug Day to to focus our efforts on fixing things in the Edubuntu wiki namespace, it includes:</p>
<ul>
<li>Fixing broken links</li>
<li>Removing horribly obsolete or broken pages</li>
<li>Moving pages which are in the wrong place</li>
<li>Prettifying pages</li>
<li>Mark pages that may need to be on the Edubuntu website instead</li>
<li>Any other improvements we can think of <img alt=":)" class="wp-smiley" src="http://jonathancarter.co.za/wp-includes/images/smilies/icon_smile.gif"/> </li>
</ul>
<p>We’ll officially be starting the wiki hug day from around 12:00 UTC to accommodate the time-zones of our current contributors. It will be co-ordinated in #edubuntu on the <a href="http://freenode.net/">freenode</a> network. If you’re familiar with <a href="http://www.edubuntu.org">Edubuntu</a> and know a thing or two about wikis, feel free to join in and get involved!</p></div>
    </content>
    <updated>2010-01-18T18:10:38Z</updated>
    <category term="Education"/>
    <category term="Free Software"/>
    <category term="Edubuntu"/>
    <category term="Scott Balneaves"/>
    <author>
      <name>jonathan</name>
    </author>
    <source>
      <id>http://jonathancarter.co.za</id>
      <link href="http://jonathancarter.co.za/category/free-software/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jonathancarter.co.za" rel="alternate" type="text/html"/>
      <subtitle>rebel without a pause</subtitle>
      <title>jonathan carter » Free Software</title>
      <updated>2010-02-23T18:05:53Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.saturnlaboratories.co.za/106 at http://blog.saturnlaboratories.co.za</id>
    <link href="http://blog.saturnlaboratories.co.za/2010/01/06/database_configured_theming_in_pylons.html" rel="alternate" type="text/html"/>
    <title>Raoul Snyman (superfly): Database-configured Theming in Pylons</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Yesterday I looked at <a href="http://blog.saturnlaboratories.co.za/2010/01/05/very_simple_theming_in_pylons.html" title="Very Simple Theming in Pylons">very simple theming in Pylons</a>, and mentioned that I'd prefer loading the current theme from the database rather than the configuration file. So this evening I decided to see if I could achieve that.</p>
<p>Looking in environment.py, I noticed that SQLAlchemy and the models were being configured and initialised last in the load_environment method. I moved those two lines up to the top of that method, and changed "config" to "app_conf". Then I simply did a normal Session.query() to fetch my theme name out of the "variables" table in my database.</p>
<p>Now that I had my theme name, I constructed my theme directory using the path to the themes directory from my configuration file and the name of the theme from the database. Then I set up my static files and tempaltes directories using the new theme directory.</p>
<p>Lastly, I wanted to do something that Drupal, the CMS that powers this blog, does with it's theming system. Drupal has a set of fall-back templates so that if you don't provide (whether by mistake or by choice) all the templates a theme needs, the default Drupal templates are used. This was very easy to set up, because Mako's TemplateLookup class accepts a list of template paths. So all I did was add the normal Pylons template path to the list as well.</p>
<p>So now my file looks like this:</p>
<div class="geshifilter"><pre class="python geshifilter-python" style="font-family: monospace;"><ol start="15"><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;"><span style="color: #ff7700; font-weight: bold;">def</span> load_environment<span style="color: black;">(</span>global_conf, app_conf<span style="color: black;">)</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    <span style="color: #483d8b;">"""</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;"><span style="color: #483d8b;">    Configure the Pylons environment via the ``pylons.config`` object</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;"><span style="color: #483d8b;">    """</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    <span style="color: #808080; font-style: italic;"># Setup the SQLAlchemy database engine</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    engine = engine_from_config<span style="color: black;">(</span>app_conf, <span style="color: #483d8b;">'sqlalchemy.'</span><span style="color: black;">)</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    init_model<span style="color: black;">(</span>engine<span style="color: black;">)</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;"> </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    <span style="color: #808080; font-style: italic;"># Pull out theme variable</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    theme = Session.<span style="color: black;">query</span><span style="color: black;">(</span>Variable<span style="color: black;">)</span>.<span style="color: black;">get</span><span style="color: black;">(</span>u<span style="color: #483d8b;">'theme'</span><span style="color: black;">)</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    <span style="color: #ff7700; font-weight: bold;">if</span> <span style="color: #ff7700; font-weight: bold;">not</span> theme:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">        theme_name = u<span style="color: #483d8b;">'default'</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    <span style="color: #ff7700; font-weight: bold;">else</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">        theme_name = theme.<span style="color: black;">value</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;"> </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    <span style="color: #808080; font-style: italic;"># Pylons paths</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    root = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">(</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">(</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">(</span>__file__<span style="color: black;">)</span><span style="color: black;">)</span><span style="color: black;">)</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    theme_dir = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">(</span>app_conf<span style="color: black;">[</span>u<span style="color: #483d8b;">'themes.directory'</span><span style="color: black;">]</span>, theme_name<span style="color: black;">)</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    paths = <span style="color: #008000;">dict</span><span style="color: black;">(</span>root=root,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">                 controllers=<span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">(</span>root, <span style="color: #483d8b;">'controllers'</span><span style="color: black;">)</span>,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">                 static_files=<span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">(</span>theme_dir, <span style="color: #483d8b;">'public'</span><span style="color: black;">)</span>,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">                 templates=<span style="color: black;">[</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">(</span>theme_dir, <span style="color: #483d8b;">'templates'</span><span style="color: black;">)</span>,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">                            <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">(</span>root, <span style="color: #483d8b;">'templates'</span><span style="color: black;">)</span><span style="color: black;">]</span><span style="color: black;">)</span></div></li></ol></pre></div>
<p>As usual, any comments or suggestions are welcome</p></div>
    </summary>
    <updated>2010-01-06T19:30:18Z</updated>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/database.html" term="Database"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/pylons.html" term="Pylons"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/python.html" term="Python"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/templates.html" term="Templates"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/themes.html" term="Themes"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/theming.html" term="Theming"/>
    <author>
      <name>raoul</name>
    </author>
    <source>
      <id>http://blog.saturnlaboratories.co.za</id>
      <link href="http://blog.saturnlaboratories.co.za" rel="alternate" type="text/html"/>
      <link href="http://blog.saturnlaboratories.co.za/rss.xml" rel="self" type="application/rss+xml"/>
      <title>Planetary Ponderings - The ponderings of a Christian open source geek...</title>
      <updated>2010-01-07T18:05:49Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.saturnlaboratories.co.za/105 at http://blog.saturnlaboratories.co.za</id>
    <link href="http://blog.saturnlaboratories.co.za/2010/01/05/very_simple_theming_in_pylons.html" rel="alternate" type="text/html"/>
    <title>Raoul Snyman (superfly): Very Simple Theming in Pylons</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>For a while I've been thinking about how to achieve themes in some of my Pylons applications, and just today I was looking around in my environment.py file, and saw the configuration of the templates and public directories. That gave me an idea, <em>can I load a theme directory from the configuration file and use it in there?</em></p><p>I had a bit of a false start initially, I thought that I could just use the config object as I do elsewhere in my application, but that didn't want to work. Eventually I found the solution: the app_conf object.</p><p>This is how my code now looks:</p>
<div class="geshifilter"><pre class="python geshifilter-python" style="font-family: monospace;"><ol start="19"><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    ...</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    <span style="color: black;">theme_dir</span> = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">(</span>app_conf<span style="color: black;">[</span><span style="color: #483d8b;">'themes.directory'</span><span style="color: black;">]</span>, app_conf<span style="color: black;">[</span><span style="color: #483d8b;">'themes.current'</span><span style="color: black;">]</span><span style="color: black;">)</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    paths = <span style="color: #008000;">dict</span><span style="color: black;">(</span>root=root,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">                 controllers=<span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">(</span>root, <span style="color: #483d8b;">'controllers'</span><span style="color: black;">)</span>,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">                 static_files=<span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">(</span>theme_dir, <span style="color: #483d8b;">'public'</span><span style="color: black;">)</span>,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">                 templates=<span style="color: black;">[</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">(</span>theme_dir, <span style="color: #483d8b;">'templates'</span><span style="color: black;">)</span><span style="color: black;">]</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    <span style="color: black;">)</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">    ...</div></li></ol></pre></div>
<p>And the relevant lines in my config.ini file:</p>
<div class="geshifilter"><pre class="ini geshifilter-ini" style="font-family: monospace;"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">themes.directory <span style="color: #000066; font-weight: bold;">=</span><span style="color: #660066;"> %<span>(</span>here<span>)</span>s/themes</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal;">themes.current <span style="color: #000066; font-weight: bold;">=</span><span style="color: #660066;"> default</span></div></li></ol></pre></div>
<p>Each theme is simply a directory with two subdirectories, "public" where my images, styles and scripts live, and "templates" where my template files live.</p>
<p>I'm still looking into how I can pull the current theme from the database at this early stage of the application, but this is a start in the right direction.</p>
<p>Hopefully, this will help someone else. If you have any suggestions for a better or more elegant solution, I'd be keen to hear about it.</p></div>
    </summary>
    <updated>2010-01-05T13:52:44Z</updated>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/pylons.html" term="Pylons"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/python.html" term="Python"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/templates.html" term="Templates"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/themes.html" term="Themes"/>
    <author>
      <name>raoul</name>
    </author>
    <source>
      <id>http://blog.saturnlaboratories.co.za</id>
      <link href="http://blog.saturnlaboratories.co.za" rel="alternate" type="text/html"/>
      <link href="http://blog.saturnlaboratories.co.za/rss.xml" rel="self" type="application/rss+xml"/>
      <title>Planetary Ponderings - The ponderings of a Christian open source geek...</title>
      <updated>2010-01-07T18:05:50Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://www.bloggroll.com/view/16</id>
    <link href="http://www.bloggroll.com/view/sap-crm-2007-javascript-hide" rel="alternate" type="text/html"/>
    <title>Jonathan Groll (eyesonly): Dynamically hide elements with javascript - SAP CRM 2007</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img alt="" class="r" src="http://bloggroll.com/stat/sap.png"/> In a recent <span class="caps">SAP</span> <span class="caps">CRM</span> 2007 implementation, we had the requirement to hide a view <em>(“partial”)</em> in response to a change in a dropdown value.</p>
<p>This is easily done using javascript code on the client side, and what’s more such a solution to the problem is easy to implement and is not really restricted to <span class="caps">SAP</span> <span class="caps">CRM</span> 2007 or even <span class="caps">SAP</span> web development in general.</p><p>This is what we wished to achieve – hide block ‘A’ on the following screen if the value in the category dropdown ‘B’ is anything other than “corporate brands”:</p>
<p><img alt="" src="http://bloggroll.com/stat/block_a_b_half.jpg"/></p>
<p>This can be done using the <span class="caps">ABAP</span> <span class="caps">CRM</span> framework, but there are several potential concerns:</p>
<ol>
	<li>Components not previously enhanced may require enhancement</li>
	<li>Components are designed to be independent, and making one component rely on another (which we want to do here) involves creating some sort of shared attribute</li>
	<li>In order to suppress a view it will be necessary to re-render all views on the current frame and will involve an unnecessary round trip.</li>
</ol>
<p>It was therefore decided to solve this problem using javascript code.</p>
<p>As <span class="caps">SAP</span> <span class="caps">CRM</span> 2007 is supported by Firefox (version 2, although version 3 will work with rendering glitches), it is possible to use the Firefox ‘Firebug’ extension to inspect a web page and determine the relationship between elements on screen and appropriate blocks of <span class="caps">HTML</span>.</p>
<p>From Firebug analysis (or if you have patience to do this manually) it was determined that this block of <span class="caps">HTML</span> code represents the Dropdown B:</p>
<pre><code>&lt;td class="th-ip-td1" style="overflow: hidden; width: 100%;"&gt;
&lt;fieldset class="th-if-wrapper-onfocus" style="border: 0pt none ; margin-right: 3px;"&gt;
&lt;input id="C14_W59_V60_ClassificationDdlb1" class="th-if th-if-icon" readonly="readonly" 
value="Corporate Brands" onkeydown="thtmlb_ddlbInputKeyDown(this,event);"
style="width: 100%;" size="16" onblur="thtmlb_inputBlur(this);"
onfocus="thtmlb_inputFocus(this);thtmlbSaveKeyboardFocus('C14_W59_V60_ClassificationDdlb1');"
onclick="thtmlb_inputClick(this,7);"/&gt;
&lt;/fieldset&gt;</code>

</pre>
<p>The element we’re interested in detecting a change of value for is the input tag with id “C14_W59_V60_ClassificationDdlb1”</p>
<p>This block of <span class="caps">HTML</span> code represents the viewset area A that we will be hiding (ignoring a lot of the inner <span class="caps">HTML</span>):</p>
<pre><code>&lt;td class="th-gr-td" valign="top" rowspan="1" colspan="1"&gt;
&lt;div id="C11_W43_V44_V48" excevt=""
intevt="c:C11_W43_V44_V48:C1_W1_V2_C1_W1_V2_V3_C11_W43_V44_C11_W43_V44_V48_productdetailviewset.do;" 
automode="true" tgt="" dhe="true" 
style="display: inline;"&gt;
&lt;!-- Begin C11_W43_V44_V48 --&gt;
&lt;div id="C1_W1_V2_C1_W1_V2_V3_C11_W43_V44_C11_W43_V44_V48_productdetailviewset.do" class="th-ajax-area"&gt;
&lt;!-- Begin C1_W1_V2_C1_W1_V2_V3_C11_W43_V44_C11_W43_V44_V48_productdetailviewset.do --&gt;
&lt;table ....</code>

</pre>
<p>The element we’re interested in hiding is the div with id=“C1_W1_V2_C1_W1_V2_V3_C11_W43_V44_C11_W43_V44_V48_productdetailviewset.do”</p>
<p>In it’s simplest case, the following javascript, if inserted into the view somewhere after the thtmlb:gridCell tag that declares dropdown element B, does what is required – it will hide block A if the value of dropdown B changes to anything other than “Corporate Brands”:</p>
<pre><code>&lt;script for="ClassificationDdlb1" event=onchange type="text/javascript"&gt;
var dd = document.getElementById("C14_W59_V60_ClassificationDdlb1");
var hidee = document.getElementById("C1_W1_V2_C1_W1_V2_V3_C11_W43_V44_C11_W43_V44_V48_productdetailviewset.do");
if(dd.value != "Corporate Brands"){
  hidee.style.display = 'none';
}
else {
  hidee.style.display = 'inline';
}
&lt;/script&gt;</code>

</pre>
<p>Of course, we’re going to require something a little more complicated! The problem is that the id for the elements under consideration is not fixed – the C14_W59_V60 will be different for different roles and is affected by configuration changes. One way to solve this problem is to write a javascript function that will go through all elements and check for a regular expression match based on the contents of id. However the javascript function getElementById only accepts an exact match on id.</p>
<p>A custom function fuzzyElementSearch was created to find the element of interest (this function is contained within the file jonathan.js which will be listed afterwards), this is what the call to this function looks like:</p>
<pre><code>&lt;script src="/sap/bc/bsp/sap/crmcmp_ic_frame/scripts/common/jonathan.js" type="text/javascript"&gt;
&lt;/script&gt;
&lt;script for="ClassificationDdlb1" event=onchange type="text/javascript"&gt;</code>

<code>var dd       = fuzzyElementSearch("th-ip-td1","td",null,"input","ClassificationDdlb1", 0)[0];
var dd2      = dd[0];
var hide     = fuzzyElementSearch("th-gr-td","td", null, "div","productdetailviewset", 1)[0];
if ((hide) &amp;&amp; (dd2) &amp;&amp; (hide.length &gt; 0)) {
  var hide2    = hide[0];</code>

<code>  if ((dd2.value) != "Corporate Brands") {
    hide2.style.display = 'none';
  }
  else {
    hide2.style.display = 'inline';
  }
}</code>

<code>&lt;/script&gt;</code>

</pre>
<p>The file jonathan.js contains the following javascript:-</p>
<pre><code>function fuzzyElementSearch(classname, tagname, root, tag2, subbie, level) {</code>

<code>    // Call function from Rhino book that returns
    // an array of DOM elements that are members of the specified class,
    // have the specified tagname, and are descendants of the specified root.
    var elements = getElements(classname, tagname, root);</code>

<code>    // Find children (of tag2) for each of these elements
    var subfound = [];</code>

<code>    for(var i = 0; i &lt; elements.length; i++) {
        var subchild  = elements[i];
        var grandkids = subchild.getElementsByTagName(tag2);
        if (grandkids) subfound.push(grandkids);
    }</code>

<code>    // search "level" deep for each of the above matches
    // for an element where the id contains the substring
    var pattern = new RegExp(subbie, "g");
    var matches = [];
    for(var i = 0; i &lt; subfound.length; i++) {
        var matchee  = subfound[i];
        if (matchee.length &gt; level) {
          var matchin = matchee[level];
          var matchid = matchin.id;
          var reslt = pattern.test(matchid);
          if(reslt == true) {
             matches.push(matchee);
          }
        }
    }</code>

<code>    // Note that we always return an array, even if it is empty
    return matches;</code>


<code> // *** The following attribution applies to the rest of the code in this file
 // This code is from the book JavaScript: The Definitive Guide, 5th Edition,
 // by David Flanagan. Copyright 2006 O'Reilly Media, Inc. (ISBN #0596101996)
 // *** </code>

<code> /* Rest of code == EXAMPLE 15-4 From David Flanagan, "Javascript"
 * getElements(classname, tagname, root):
 * Return an array of DOM elements that are members of the specified class,
 * have the specified tagname, and are descendants of the specified root.
 *
 * If no classname is specified, elements are returned regardless of class.
 * If no tagname is specified, elements are returned regardless of tagname.
 * If no root is specified, the document object is used.  If the specified
 * root is a string, it is an element id, and the root
 * element is looked up using getElementsById()
 */
    function getElements(classname, tagname, root) {
        // If no root was specified, use the entire document
        // If a string was specified, look it up
        if (!root) root = document;
        else if (typeof root == "string") root = document.getElementById(root);</code>

<code>        // if no tagname was specified, use all tags
        if (!tagname) tagname = "*";</code>

<code>        // Find all descendants of the specified root with the specified tagname
        var all = root.getElementsByTagName(tagname);</code>

<code>        // If no classname was specified, we return all tags
        if (!classname) return all;</code>

<code>        // Otherwise, we filter the element by classname
        var elements = [];  // Start with an emtpy array
        for(var i = 0; i &lt; all.length; i++) {
            var element = all[i];
            if (isMember(element, classname)) // isMember() is defined below
                elements.push(element);       // Add class members to our array
        }</code>

<code>        // Note that we always return an array, even if it is empty
        return elements;</code>

<code>        // Determine whether the specified element is a member of the specified
        // class.  This function is optimized for the common case in which the
        // className property contains only a single classname.  But it also
        // handles the case in which it is a list of whitespace-separated classes.
        function isMember(element, classname) {
            var classes = element.className;  // Get the list of classes
            if (!classes) return false;             // No classes defined
            if (classes == classname) return true;  // Exact match</code>

<code>            // We didn't match exactly, so if there is no whitespace, then
            // this element is not a member of the class
            var whitespace = /\s+/;
            if (!whitespace.test(classes)) return false;</code>

<code>            // If we get here, the element is a member of more than one class and
            // we've got to check them individually.
            var c = classes.split(whitespace);  // Split with whitespace delimiter
            for(var i = 0; i &lt; c.length; i++) { // Loop through classes
                if (c[i] == classname) return true;  // and check for matches
            }</code>

<code>            return false;  // None of the classes matched
        }
    }
}</code>

</pre>
<p>The function fuzzyElementSearch accepts five parameters, and is used to find the element based on it’s relation to an an outer element. In other words, we find the element we’re interested in based on the context of the surrounding <span class="caps">HTML</span> code.</p>
<p>So, if we consider the case where we are looking for the element that represents viewset A that we want to hide:</p>
<pre><code>&lt;td class="th-gr-td" valign="top" rowspan="1" colspan="1"&gt;
&lt;div id="C11_W43_V44_V48" excevt=""
intevt="c:C11_W43_V44_V48:C1_W1_V2_C1_W1_V2_V3_C11_W43_V44_C11_W43_V44_V48_productdetailviewset.do;" 
automode="true" tgt="" dhe="true" style="display: inline;"&gt;
&lt;!-- Begin C11_W43_V44_V48 --&gt;
&lt;div id="C1_W1_V2_C1_W1_V2_V3_C11_W43_V44_C11_W43_V44_V48_productdetailviewset.do" class="th-ajax-area"&gt;
&lt;!-- Begin C1_W1_V2_C1_W1_V2_V3_C11_W43_V44_C11_W43_V44_V48_productdetailviewset.do --&gt;
&lt;table ....</code>

</pre>
<p>The outer element in this case is <code>&lt;td class="th-gr-td" valign="top" rowspan="1" colspan="1"&gt;</code><br/>
The inner element (which is what we want in the end) will be <code>&lt;div id="C1_W1_V2_C1_W1_V2_V3_C11_W43_V44_C11_W43_V44_V48_productdetailviewset.do" class="th-ajax-area"&gt;</code></p>
<p>The following five parameters supplied to the fuzzyElementSearch are what the function uses to robustly identify the element we want:-</p>
<ul>
	<li>classname = the <span class="caps">CSS</span> class of the outer element, or th-gr-td in this case.</li>
	<li>tagname = the tag type of the outer element, td in this case</li>
	<li>root = the root element from which we start searching. We’ll search the entire document so can leave this as null</li>
	<li>tag2 = the tag type of the inner element, or div in this case</li>
	<li>subbie = substring (actually a regular expression string) that will match the id of the inner element</li>
	<li>level = number of levels down from outer tag to inner tag. In the above case, we are interested in the 2nd div tag nested inside the td tag. Since javascript counting starts at 0 the level we are interested in is level 1.</li>
</ul>
<p>Putting it all together, the following call to the fuzzyElementSearch gives us the inner element we want every time (it will be the first item in the array returned):</p>
<pre><code>var hide     = fuzzyElementSearch("th-gr-td","td", null, "div","productdetailviewset", 1)[0];</code>

</pre>
<p>How does fuzzyElementSearch work? It makes use of a function getElements that is from David Flanagan’s book “Javascript” (<span class="caps">ISBN</span>  0-596-10199-6, also known as the Rhino book) – this function allows us to search for elements based on class and/or tag name. With the results of this function similar code is used to find all the children of these elements that have the correct tag and regular expression match. I heartily endorse David Flanagan’s book, and if you are interested in learning javascript then consider visiting <a href="http://www.davidflanagan.com/javascript5/">the book’s web site</a>.</p></div>
    </summary>
    <updated>2009-12-18T14:58:06Z</updated>
    <source>
      <id>http://www.bloggroll.com/</id>
      <author>
        <name>Jonathan Groll (eyesonly)</name>
      </author>
      <link href="http://www.bloggroll.com/" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/BloggrollTech" rel="self" type="application/rss+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>The webshite of Jonathan Groll</subtitle>
      <title>The Bloggroll</title>
      <updated>2010-02-18T00:05:52Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://blog.saturnlaboratories.co.za/104 at http://blog.saturnlaboratories.co.za</id>
    <link href="http://blog.saturnlaboratories.co.za/2009/12/15/hp_deskjet_d2663_on_ubuntu_hardy.html" rel="alternate" type="text/html"/>
    <title>Raoul Snyman (superfly): HP Deskjet D2663 on Ubuntu Hardy</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Yesterday I had to buy a new printer because my old one packed up over the weekend. Since I run Ubuntu/Kubuntu Linux exclusively at home, I needed a printer I could be sure would work in Linux. This means that generally I need to get either HP or Epson printers. I've had both makes of printers before, and they've both served me well, so I have no problem being "limited" to those two.</p><p>I picked up an HP Deskjet D2663, a printer similar to my last one, one of the bottom of the range of HP's. I don't need anything fancy, I already have a small photo printer (it came with the camera) and I doubt I'd use the scanner from one of those all-in-ones. The D2663 is a cheap printer, but a decent one.</p><p>My wife and I have separate computers, which means that we need a shared printer, so I attach my computer to one of the servers at home and then we both have access to it at the same time. Unfortunately the server is running Hardy, which means it doesn't have the latest driver for this brand new printer.</p><p>I went to the HPLIP site, and downloaded the tarball, and looked for a PPD file. I found the HP Deskjet D2600 series PPD, but when I loaded it, I got an error message that said that the "foomatic-rip-hplip" filter was not found. I opened the PPD file and found two lines that specified that filter. After a bit of googling, I found that I just needed to remove the "-hplip" from the filter name, and it worked!</p><p>Yay, so now I have a new printer, working perfectly on my Ubuntu Hardy server. </p></div>
    </summary>
    <updated>2009-12-15T05:14:00Z</updated>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/deskjet.html" term="Deskjet"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/hardy.html" term="Hardy"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/hp.html" term="HP"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/hp_deskjet_d2663.html" term="HP Deskjet D2663"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/printer.html" term="Printer"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/printing.html" term="Printing"/>
    <category scheme="http://blog.saturnlaboratories.co.za/tags/ubuntu.html" term="Ubuntu"/>
    <author>
      <name>raoul</name>
    </author>
    <source>
      <id>http://blog.saturnlaboratories.co.za</id>
      <link href="http://blog.saturnlaboratories.co.za" rel="alternate" type="text/html"/>
      <link href="http://blog.saturnlaboratories.co.za/rss.xml" rel="self" type="application/rss+xml"/>
      <title>Planetary Ponderings - The ponderings of a Christian open source geek...</title>
      <updated>2010-01-07T18:05:49Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://www.bloggroll.com/view/15</id>
    <link href="http://www.bloggroll.com/view/mencoder-index-fixing" rel="alternate" type="text/html"/>
    <title>Jonathan Groll (eyesonly): Using mencoder to fix a broken video file index</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img alt="" class="l" src="http://bloggroll.com/stat/mplayer.jpg"/>An oldie, but a goodie, and there is always someone out there who doesn’t know about this. Often, one encounters video files that do not have an index or have a broken index- this is almost certainly the case if your media player or <span class="caps">PVR</span> refuses to allow you to fast forward within the file. Easily fixed under Linux using the following mencoder incantation:</p>
<pre><code>mencoder -idx input.avi -ovc copy -oac copy -o output.avi</code>

</pre>
<p>As a bonus, this apparently also repairs broken <a href="http://forum.doom9.org/archive/index.php/t-93469.html">interleaving</a>.</p>
<p>Some more great mplayer/mencoder hints, including tricks such as appending multiple <span class="caps">AVI</span> <a href="http://web.njit.edu/all_topics/Prog_Lang_Docs/html/mplayer/encoding.html">files are here</a>.</p></div>
    </summary>
    <updated>2009-11-24T07:32:06Z</updated>
    <source>
      <id>http://www.bloggroll.com/</id>
      <author>
        <name>Jonathan Groll (eyesonly)</name>
      </author>
      <link href="http://www.bloggroll.com/" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/BloggrollTech" rel="self" type="application/rss+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>The webshite of Jonathan Groll</subtitle>
      <title>The Bloggroll</title>
      <updated>2010-02-18T00:05:51Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://confluence.za.net/blog/?p=198</id>
    <link href="http://confluence.za.net/blog/?p=198" rel="alternate" type="text/html"/>
    <link href="http://confluence.za.net/blog/?p=198#comments" rel="replies" type="text/html"/>
    <link href="http://confluence.za.net/blog/?feed=atom&amp;p=198" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Adrianna Pińska (Confluence): Unserious post is unserious</title>
    <summary xml:lang="en">There’s too much Serious Business on my front page!  Something must be done.
You should buy Machinarium; it is an awesome indie point-and-click adventure game about robots.  It has really pretty art, and versions for Windows, Mac and Linux.  (It’s written in flash, and the standalone flash player for Linux is really grotty, [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>There’s too much Serious Business on my front page!  Something must be done.</p>
<p>You should buy <a href="http://machinarium.net">Machinarium</a>; it is an awesome indie point-and-click adventure game about robots.  It has really pretty art, and versions for Windows, Mac and Linux.  (It’s written in flash, and the standalone flash player for Linux is really grotty, but everything worked for me after I followed some helpful instructions on the forum.  Run the executable with G_SLICE=always-malloc … to prevent random segfaults, and turn off full screen mode straight away or mouse control will go wonky.) You can play a demo at the site to see if you like it.  The full version is a 350MB download.  It’s only $20 for at least a day’s worth of playing (if you’re the kind of person who will stay up until 4AM obsessively trying to finish it), and comes with absolutely no DRM — which I think is worth supporting.</p></div>
    </content>
    <updated>2009-11-23T08:39:01Z</updated>
    <published>2009-11-23T08:39:01Z</published>
    <category scheme="http://confluence.za.net/blog" term="Games"/>
    <category scheme="http://confluence.za.net/blog" term="Reviews"/>
    <category scheme="http://confluence.za.net/blog" term="Tech and coding"/>
    <author>
      <name>confluence</name>
      <uri>http://confluence.za.net</uri>
    </author>
    <source>
      <id>http://confluence.za.net/blog/?feed=atom</id>
      <link href="http://confluence.za.net/blog" rel="alternate" type="text/html"/>
      <link href="http://confluence.za.net/blog/?cat=22&amp;feed=atom" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">Powered by space monkeys!</subtitle>
      <title xml:lang="en">Confluence » Tech and coding</title>
      <updated>2009-11-23T08:39:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-22557003.post-9206162008656973091</id>
    <link href="http://blog.grahampoulter.com/2009/10/google-maps-south-africa-launches-new.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/22557003/posts/default/9206162008656973091" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/22557003/posts/default/9206162008656973091" rel="self" type="application/atom+xml"/>
    <link href="http://blog.grahampoulter.com/2009/10/google-maps-south-africa-launches-new.html" rel="alternate" type="text/html"/>
    <title>Graham Poulter (verdant): Google Maps South Africa launches new features for 2010</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Today <a href="http://www.linkedin.com/in/jarda">Jaroslav Bengl</a>, the Business Product Manager for Google Switzerland GmbH, presented a developer overview of Google Maps features released in South Africa just yesterday.<br/>
<br/>
<div style="margin: 0px;">
As of yesterday, the <a href="http://maps.google.co.za/">South African Google Maps</a> has <a href="http://maps.google.co.za/maps?saddr=Cape+Town,+South+Africa&amp;daddr=George,+South+Africa">driving directions</a>, reverse geocoding ("what is near this coordinate"), and overlays for terrain elevation, photos, Wikipedia, Panoramio, and public transit routes. <a href="http://en.wikipedia.org/wiki/Google_Street_View">Google Street View</a> cars are surveying Johannesburg, Cape Town, Durban, Pretoria and East London - and the street view should be ready before the World Cup. <br/>
</div>
<div style="margin: 0px;">
<br/>
</div>
<div style="margin: 0px;">
Here is a view of the Koeberg Interchange which now has directional arrows used by the route finders:<br/>
</div>
<div style="margin: 0px;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/_rswIZalsPuc/SutEAdEEm3I/AAAAAAAABKg/3kVuas2PGzk/s1600-h/staticmap.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/_rswIZalsPuc/SutEAdEEm3I/AAAAAAAABKg/3kVuas2PGzk/s320/staticmap.png"/></a><br/></div>
<br/>
</div>
<div style="margin: 0px;">
<div style="margin: 0px;">
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.<br/>
<br/>
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.  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 <a href="http://www.openstreetmap.org/">OpenStreetMap</a>, who even took the trouble to mark on OpenStreetMap the changes to the Koeberg Interchange that are under construction:<br/>
<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/_rswIZalsPuc/SutFIR25hzI/AAAAAAAABKo/ehaLZAtrxBg/s1600-h/map.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_rswIZalsPuc/SutFIR25hzI/AAAAAAAABKo/ehaLZAtrxBg/s320/map.png"/></a><br/></div>
<br/>
On the <a href="http://code.google.com/apis/maps/documentation/demogallery.html">Google Maps API</a> side of things, the <a href="http://code.google.com/apis/maps/documentation/examples/geocoding-simple.html">geocoding API</a> (address-&gt;latitude/longitude) is now also available in South Africa, and the search box supports mixed languages: searching for "<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">cape town ショッピング</a>" where the second word is Japanese for "shopping" works as expected.  However, "<a href="http://maps.google.co.za/maps?q=%EB%A0%88%EC%8A%A4%ED%86%A0%EB%9E%91+cape+town">레스토랑 cape town</a>" where the first word is Korean for "restaurant" brings up hotels instead.   There are many APIs for <a href="http://code.google.com/apis/maps/documentation/examples/geoxml-kml.html">overlaying your own data </a>on Google Maps, for example using a public KML feed. The <a href="http://maps.google.com/help/terms_maps.html">terms of service</a> require in any case that apps using the free Google Maps API themselves be free and open to the public.<br/>
</div>
</div><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/22557003-9206162008656973091?l=blog.grahampoulter.com" width="1"/></div></div>
    </content>
    <updated>2009-10-31T06:39:21Z</updated>
    <published>2009-10-30T20:42:00Z</published>
    <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"/>
    <author>
      <name>Graham</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/16072516650932490004</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-22557003</id>
      <author>
        <name>Graham</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/16072516650932490004</uri>
      </author>
      <link href="http://blog.grahampoulter.com/feeds/posts/full" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/22557003/posts/full/-/tech" rel="self" type="application/atom+xml"/>
      <link href="http://blog.grahampoulter.com/search/label/tech" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>Articles by Graham Poulter</subtitle>
      <title>Graham says...</title>
      <updated>2010-03-15T09:57:26Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-22557003.post-8572955450956837785</id>
    <link href="http://blog.grahampoulter.com/2009/10/south-african-user-experience-forum.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/22557003/posts/default/8572955450956837785" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/22557003/posts/default/8572955450956837785" rel="self" type="application/atom+xml"/>
    <link href="http://blog.grahampoulter.com/2009/10/south-african-user-experience-forum.html" rel="alternate" type="text/html"/>
    <title>Graham Poulter (verdant): The South African User Experience Forum</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The South African User Experience Forum
("SA UX Forum") is a community of practice in the field of user
experience design.<br/>
<br/>
I went to a SA UX Forum event last night at 24.com, organised by <a href="http://www.google.com/profiles/philbuk">Phil Barrett</a>  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.<br/>
<br/>
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
<a href="http://www.balsamiq.com/products/mockups">Balsamiq Mockups</a>  a lo-fi
sketching software for Adobe Air.  <br/>
<br/>
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 <a href="http://groups.google.com/group/sa-ux-forum">Google Group</a> and <a href="http://www.facebook.com/group.php?gid=2750787123">Facebook</a>.  Here's a <a href="http://groups.google.com/group/sa-ux-forum/web/sa-ux-meetup---cape-town%20">list of their previous meet-ups</a>
and <a href="http://groups.google.com/group/sa-ux-forum/web/ux-resources%20">other user experience resources</a>
<br/><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/22557003-8572955450956837785?l=blog.grahampoulter.com" width="1"/></div></div>
    </content>
    <updated>2009-10-30T21:25:44Z</updated>
    <published>2009-10-29T08:45:00Z</published>
    <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"/>
    <author>
      <name>Graham</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/16072516650932490004</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-22557003</id>
      <author>
        <name>Graham</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/16072516650932490004</uri>
      </author>
      <link href="http://blog.grahampoulter.com/feeds/posts/full" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/22557003/posts/full/-/tech" rel="self" type="application/atom+xml"/>
      <link href="http://blog.grahampoulter.com/search/label/tech" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>Articles by Graham Poulter</subtitle>
      <title>Graham says...</title>
      <updated>2010-03-15T09:57:26Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-22557003.post-3891168086892186006</id>
    <link href="http://blog.grahampoulter.com/2008/12/mid-obzfest-blogging.html#comment-form" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/22557003/posts/default/3891168086892186006" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/22557003/posts/default/3891168086892186006" rel="self" type="application/atom+xml"/>
    <link href="http://blog.grahampoulter.com/2008/12/mid-obzfest-blogging.html" rel="alternate" type="text/html"/>
    <title>Graham Poulter (verdant): Mid-ObzFest Blogging</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="http://4.bp.blogspot.com/_rswIZalsPuc/SXO0uYstNQI/AAAAAAAABAc/18Mg5xLIVbc/s1600-h/loveobs.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5292772696087409922" src="http://4.bp.blogspot.com/_rswIZalsPuc/SXO0uYstNQI/AAAAAAAABAc/18Mg5xLIVbc/s320/loveobs.jpg" style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 120px; height: 174px;"/></a>
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 <a href="http://twitter.com/grahampoulter">Twitter</a> (or <a href="http://identi.ca/">identi.ca</a>).

1. Sign up at <a href="http://twitter.com/">twitter.com</a>.  Follow your  <a href="http://twitter.com/grahampoulter">friends</a> (all of them), and your friends will follow you as well.

2. Install a twitter-supporting app like <a href="http://www.fring.com/">Fring</a> 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 "<i>graham:</i> 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.<div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/22557003-3891168086892186006?l=blog.grahampoulter.com" width="1"/></div></div>
    </content>
    <updated>2009-10-30T21:25:44Z</updated>
    <published>2008-12-06T19:22:00Z</published>
    <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"/>
    <author>
      <name>Graham</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/16072516650932490004</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-22557003</id>
      <author>
        <name>Graham</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/16072516650932490004</uri>
      </author>
      <link href="http://blog.grahampoulter.com/feeds/posts/full" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/22557003/posts/full/-/tech" rel="self" type="application/atom+xml"/>
      <link href="http://blog.grahampoulter.com/search/label/tech" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>Articles by Graham Poulter</subtitle>
      <title>Graham says...</title>
      <updated>2010-03-15T09:57:26Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://confluence.za.net/blog/?p=185</id>
    <link href="http://confluence.za.net/blog/?p=185" rel="alternate" type="text/html"/>
    <link href="http://confluence.za.net/blog/?p=185#comments" rel="replies" type="text/html"/>
    <link href="http://confluence.za.net/blog/?feed=atom&amp;p=185" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Adrianna Pińska (Confluence): Better late than never</title>
    <summary xml:lang="en">I’m about to upload my photos of our Dragonfire LARP, which happened only two months ago.  This is still less laggy than Hodgestar’s birthday party.  In order to upload the photos I am upgrading digikam, so that I can use a non-faily flickr upload plugin.  In order to upgrade digikam I need [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m about to upload my photos of our Dragonfire LARP, which happened only two months ago.  This is still less laggy than Hodgestar’s birthday party.  In order to upload the photos I am upgrading digikam, so that I can use a non-faily flickr upload plugin.  In order to upgrade digikam I need to upgrade the rest of KDE from the kubuntu-backports PPA — this is currently chugging away in the background.</p>
<p>I have embarked on an epic sewing project — making myself and Hodgestar medieval Japanese outfits for Here Be Dragons, the annual SCA away weekend event which is about a month away.  I’m making <a href="http://www.iz2.or.jp/english/fukusyoku/wayou/9.htm">this</a> (except with a maroon hakama because the shop had no red linen) and <a href="http://www.iz2.or.jp/english/fukusyoku/busou/5.htm">this kind of thing</a> (except black, because that’s the colour of the hakama Hodgestar already has).</p>
<p>The nice thing about Japanese clothing is that it’s mostly a whole lot of rectangles.  The only tricky part of the kimono-type garment is the collar.  I think I’ve been having problems because my seams are tiny and all the instructions on the interwebs assume that you’re going to leave enormous seam allowances — so my collars are too wide and too high up on the body and need to be re-sewn.  I need to test this theory out on the two very nearly finished kosode I’ve just made.  The reason I’m writing a rambly blog post and not sewing right now is that V:TES players have taken over the lounge table.</p>
<p>After a very long wait, my kalahari.net book order arrived, and here is my loot:</p>
<ul>
<li><em>The Never Ending Sacrifice</em> by Una McCormack — it’s a DS9 tie-in novel; don’t judge me.  I first read Una McCormack’s fanfiction during one of my previous love affairs with Deep Space Nine, and her pro fiction is just as good.  This is a stand-alone story about a minor canon character.</li>
<li><em>Worlds of Star Trek Deep Space Nine: Cardassia and Andor</em> (purchased for the Cardassia half, also by Una McCormack; I’m leaving the other half for later) — also good, but (obviously) shorter.</li>
<li><em>Kimono: Fashioning Culture</em> by Lisa Dalby — a well-regarded reference book about the history of kimono.</li>
<li><em>Seed to Harvest</em> by Octavia E. Butler — a collected edition of the entire Patternist series, except for one instalment Butler really didn’t like.  Haven’t read it yet.</li>
<li><em>Stars in My Pocket Like Grains of Sand</em> by Samuel R. Delany — currently reading.  It’s slow going, because of the unusual language, but I’m enjoying it.</li>
<li><em>Zombies Calling</em> by Faith Erin Hicks — a fun, short zombie comic.  Not much to the plot, but I really like Hicks’ art.  (If she sounds familiar, it’s because she did <a href="http://faith.rydia.net/">Demonology 101</a>.)</li>
</ul>
<p>Recently discovered webcomics:</p>
<ul>
<li><a href="http://www.webcomicsnation.com/shaenongarrity/skinhorse/series.php">Skin Horse</a></li>
<li><a href="http://www.webcomicsnation.com/dirktiede/ps/series.php">Paradigm Shift</a></li>
<li><a href="http://lovecraftismissing.com">Lovecraft is Missing</a></li>
</ul>
<p>The upgrade has become unexpectedly exciting — I’ve hit <a href="https://bugs.kde.org/show_bug.cgi?id=195975">some kind of packaging bug</a>.  I guess the photos will have to wait a bit longer. :/</p></div>
    </content>
    <updated>2009-10-10T13:03:55Z</updated>
    <published>2009-10-08T22:17:49Z</published>
    <category scheme="http://confluence.za.net/blog" term="Games"/>
    <category scheme="http://confluence.za.net/blog" term="Meta"/>
    <category scheme="http://confluence.za.net/blog" term="Reviews"/>
    <category scheme="http://confluence.za.net/blog" term="Sewing"/>
    <category scheme="http://confluence.za.net/blog" term="Tech and coding"/>
    <author>
      <name>confluence</name>
      <uri>http://confluence.za.net</uri>
    </author>
    <source>
      <id>http://confluence.za.net/blog/?feed=atom</id>
      <link href="http://confluence.za.net/blog" rel="alternate" type="text/html"/>
      <link href="http://confluence.za.net/blog/?cat=22&amp;feed=atom" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">Powered by space monkeys!</subtitle>
      <title xml:lang="en">Confluence » Tech and coding</title>
      <updated>2009-11-23T08:39:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.arbitraryuser.com/blog/?p=593</id>
    <link href="http://www.arbitraryuser.com/blog/2009/09/15/quick-and-simple-server-smtp/" rel="alternate" type="text/html"/>
    <link href="http://www.arbitraryuser.com/blog/2009/09/15/quick-and-simple-server-smtp/#comments" rel="replies" type="text/html"/>
    <link href="http://www.arbitraryuser.com/blog/2009/09/15/quick-and-simple-server-smtp/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Jonathan Endersby (nlt): Quick and Simple Server SMTP</title>
    <summary xml:lang="en">I have a number of servers that I look after in various places on the intertubes. I like to have things like MDADM (Linux software RAID manager) be able to mail me when the something goes wrong like a disk dies etc.
Some of these machines are in places without reliable SMTP servers for me to [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I have a number of servers that I look after in various places on the intertubes. I like to have things like MDADM (Linux software RAID manager) be able to mail me when the something goes wrong like a disk dies etc.</p>
<p>Some of these machines are in places without reliable SMTP servers for me to send mail through and I’ve tried running my own postfix and delivering the mail directly, but invariably I run into situations where the servers that I’m trying to deliver mail to don’t like DSL IPs… and not getting a mail about a dead disk is kinda a big issue.</p>
<p>I also don’t trust a lot of ISP’s SMTP, and some of my servers move around, so one day it’ll be behind a DSL IP and the next behind a Verizon IP (where it can’t talk to smtp.dslprovider.net etc).</p>
<p>My solution is quite simple, use google. (This guide is for Ubuntu but I’m sure you’ll figure it out with other distros)</p>
<ol>
<li>Create a gmail account for monitoring. I do this because I don’t want my gmail password floating around in plaintext on various machines.</li>
<li>Install the ca-certificates package<br/>
<blockquote><p>$ sudo aptitude install ca-certificates<br/>
$ sudo update-ca-certificates
</p></blockquote>
</li>
<li>Install msmtp<br/>
<blockquote><p>
$ sudo apt-get install msmtp
</p></blockquote>
</li>
<li>Configure msmtp<br/>
<blockquote><p>
$ sudo vim /etc/msmtprc
</p></blockquote>
<p>Set it to something like </p>
<blockquote><p>account gmail<br/>
host smtp.gmail.com<br/>
from myemailaddress@gmail.com<br/>
auth on<br/>
tls on<br/>
tls_trust_file /etc/ssl/certs/ca-certificates.crt<br/>
user notifyemailaddress@gmail.com<br/>
password mys3cr3tp455w0rd<br/>
port 587</p>
<p>account default : gmail</p></blockquote>
</li>
<li>Create a sendmail simlink<br/>
<blockquote><p>
$ sudo ln -s /usr/bin/msmtp /usr/sbin/sendmail
</p></blockquote>
</li>
<li>Run a test<br/>
<blockquote><p>
$ echo “This is a an awesome test email” | msmtp youremail@domain.com
</p></blockquote>
</li>
<li>If you want mdadm to mail you when something goes wrong<br/>
<blockquote><p>
$ sudo vim /etc/mdadm/mdadm.conf
</p></blockquote>
<p>and put your email address on the line that reads something like </p>
<blockquote><p>
MAILADDR youremail@domain.com
</p></blockquote>
</li>
<li>And then run a mdadm test by running<br/>
<blockquote><p>
$ sudo mdadm –monitor –scan –test –oneshot
</p></blockquote>
</li>
<li>If everything is working according to plan you should receive an email. You can now rest assured that any future MDADM issues will get to you.</li>
</ol></div>
    </content>
    <updated>2009-09-15T21:00:03Z</updated>
    <published>2009-09-15T20:51:30Z</published>
    <category scheme="http://www.arbitraryuser.com/blog" term="Linux"/>
    <category scheme="http://www.arbitraryuser.com/blog" term="Tech"/>
    <category scheme="http://www.arbitraryuser.com/blog" term="hacking"/>
    <author>
      <name>arbitraryuser</name>
      <uri>http://www.arbitraryuser.com/blog/wp-atom.php</uri>
    </author>
    <source>
      <id>http://www.arbitraryuser.com/blog/feed/atom/</id>
      <link href="http://www.arbitraryuser.com/blog" rel="alternate" type="text/html"/>
      <link href="http://www.arbitraryuser.com/blog/category/tech/feed/atom/" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">Jonathan Endersby, Recovering Technologist</subtitle>
      <title xml:lang="en">arbitrary user » Tech</title>
      <updated>2010-03-15T09:08:26Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://michael.gorven.za.net/blog/2009/06/18/supergenpass-cellphones-command-line</id>
    <link href="http://michael.gorven.za.net/blog/2009/06/18/supergenpass-cellphones-command-line" rel="alternate" type="text/html"/>
    <title>Michael Gorven (cocooncrash): SuperGenPass for cellphones and the command line</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://supergenpass.com/">SuperGenPass</a> and <a href="http://www.xs4all.nl/~jlpoutre/BoT/Javascript/PasswordComposer/">Password Composer</a> are password generators, which
generate different passwords for each site you use based on a single master
password. This gives you the convenience of only remembering one password as
well as the security of using different (and strong) passwords for each site.
This means that you won't have all your accounts compromised when<sup id="fnref:1"><a href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed#fn:1" rel="footnote">1</a></sup> one of
them is <a href="http://www.codinghorror.com/blog/archives/000953.html">compromised</a>.</p>

<p>Most password generators are implemented as browser extensions or
<a href="http://en.wikipedia.org/wiki/Bookmarklet">bookmarklets</a>, since they are most frequently needed in a web browser. I've
been wanting to start using a password generator, but I wanted to be sure that I
could access my accounts even if I didn't have a web browser accessible. The two
situations I could think of were a command line only system (e.g. SSH) and my
cellphone<sup id="fnref:2"><a href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed#fn:2" rel="footnote">2</a></sup>.</p>

<p>Surprisingly, I couldn't find a command line implementation of SuperGenPass, so
I <a href="http://michael.gorven.za.net/files/supergenpass.py">wrote one</a> in Python. I also couldn't find any <a href="http://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition">J2ME</a> or <a href="http://en.wikipedia.org/Symbian_OS">Symbian</a>
implementations, and so wrote my <a href="http://mene.za.net/passgen/">own one</a> in J2ME. They both support subdomain
stripping and configurable password lengths. They don't support <a href="http://supergenpass.com/faq/#Technical-Details">salted
passwords</a>.</p>

<p>I chose SuperGenPass over Password Composer because it uses a better scheme.
Password Composer only uses hex characters, whereas SuperGenPass uses a
<a href="http://en.wikipedia.org/wiki/Base64">base64</a> encoded hash. SuperGenPass also hashes the password multiple times
(which would slow down a brute force attack to find the master password) and
imposes complexity requirements on the generated password (which reduces the
chances that the generated password can be brute forced).</p>

<div class="footnotes">
<hr/>
<ol>

<li id="fn:1">
<p>"When", not "if". <a href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed#fnref:1" rev="footnote">↩</a></p>
</li>

<li id="fn:2">
<p>Although my phone's browser does support JavaScript, the JavaScript MD5
implementation commonly used by password generators doesn't work correctly on
it. <a href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed#fnref:2" rev="footnote">↩</a></p>
</li>

</ol>
</div></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://supergenpass.com/">SuperGenPass</a> and <a href="http://www.xs4all.nl/~jlpoutre/BoT/Javascript/PasswordComposer/">Password Composer</a> are password generators, which
generate different passwords for each site you use based on a single master
password. This gives you the convenience of only remembering one password as
well as the security of using different (and strong) passwords for each site.
This means that you won't have all your accounts compromised when<sup id="fnref:1"><a href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed#fn:1" rel="footnote">1</a></sup> one of
them is <a href="http://www.codinghorror.com/blog/archives/000953.html">compromised</a>.</p>

<p>Most password generators are implemented as browser extensions or
<a href="http://en.wikipedia.org/wiki/Bookmarklet">bookmarklets</a>, since they are most frequently needed in a web browser. I've
been wanting to start using a password generator, but I wanted to be sure that I
could access my accounts even if I didn't have a web browser accessible. The two
situations I could think of were a command line only system (e.g. SSH) and my
cellphone<sup id="fnref:2"><a href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed#fn:2" rel="footnote">2</a></sup>.</p>

<p>Surprisingly, I couldn't find a command line implementation of SuperGenPass, so
I <a href="http://michael.gorven.za.net/files/supergenpass.py">wrote one</a> in Python. I also couldn't find any <a href="http://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition">J2ME</a> or <a href="http://en.wikipedia.org/Symbian_OS">Symbian</a>
implementations, and so wrote my <a href="http://mene.za.net/passgen/">own one</a> in J2ME. They both support subdomain
stripping and configurable password lengths. They don't support <a href="http://supergenpass.com/faq/#Technical-Details">salted
passwords</a>.</p>

<p>I chose SuperGenPass over Password Composer because it uses a better scheme.
Password Composer only uses hex characters, whereas SuperGenPass uses a
<a href="http://en.wikipedia.org/wiki/Base64">base64</a> encoded hash. SuperGenPass also hashes the password multiple times
(which would slow down a brute force attack to find the master password) and
imposes complexity requirements on the generated password (which reduces the
chances that the generated password can be brute forced).</p>

<div class="footnotes">
<hr/>
<ol>

<li id="fn:1">
<p>"When", not "if". <a href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed#fnref:1" rev="footnote">↩</a></p>
</li>

<li id="fn:2">
<p>Although my phone's browser does support JavaScript, the JavaScript MD5
implementation commonly used by password generators doesn't work correctly on
it. <a href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed#fnref:2" rev="footnote">↩</a></p>
</li>

</ol>
</div></div>
    </content>
    <updated>2009-06-18T16:17:43Z</updated>
    <published>2009-06-18T16:17:43Z</published>
    <category term="j2me"/>
    <category term="java"/>
    <category term="password composer"/>
    <category term="passwords"/>
    <category term="supergenpass"/>
    <category term="technical"/>
    <author>
      <name>mgorven</name>
    </author>
    <source>
      <id>http://michael.gorven.za.net/taxonomy/term/3/atom/feed</id>
      <link href="http://michael.gorven.za.net/tags/technical" rel="alternate" type="text/html"/>
      <link href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed" rel="self" type="application/atom+xml"/>
      <subtitle>Posts containing technical information.</subtitle>
      <title>technical</title>
      <updated>2008-10-01T15:12:23Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://morgancollett.wordpress.com/?p=182</id>
    <link href="http://morgancollett.wordpress.com/2009/05/13/ubuntu-server-versioning-etc-with-etckeeper-rocks/" rel="alternate" type="text/html"/>
    <link href="http://morgancollett.wordpress.com/2009/05/13/ubuntu-server-versioning-etc-with-etckeeper-rocks/#comments" rel="replies" type="text/html"/>
    <link href="http://morgancollett.wordpress.com/2009/05/13/ubuntu-server-versioning-etc-with-etckeeper-rocks/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Morgan Collett (morgs): Ubuntu Server: Versioning /etc with etckeeper rocks!</title>
    <summary type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Deploying a new server at work – a dedicated server hosted at Hetzner. Fortunately Jaunty (Ubuntu 9.04) was released before we had anything hosted on the machine, so I took the decision to upgrade it before we do serious deployment.
One of the shiny new features of Ubuntu Server 9.04 is etckeeper, documented here by Thierry [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morgancollett.wordpress.com&amp;blog=494363&amp;post=182&amp;subd=morgancollett&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>Deploying a new server at <a href="http://www.praekelt.com">work</a> – a dedicated server hosted at <a href="http://www.hetzner.co.za/">Hetzner</a>. Fortunately Jaunty (Ubuntu 9.04) was released before we had anything hosted on the machine, so I took the decision to upgrade it before we do serious deployment.</p>
<p>One of the shiny new features of Ubuntu Server 9.04 is etckeeper, documented <a href="http://fnords.wordpress.com/2009/03/05/etckeeper-chronicles-4/">here by </a><span class="fn"><a href="http://fnords.wordpress.com/2009/03/05/etckeeper-chronicles-4/">Thierry Carrez</a>. In particular, on 9.04 etckeeper plays well with bzr and shows the real user who typed “sudo etckeeper commit” in the bzr log, not just “root”.</span></p>
<p><span class="fn">As we have a (small but distributed) team adminning the server, this will help a great deal to keep track of who did what when.<br/>
</span></p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/morgancollett.wordpress.com/182/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morgancollett.wordpress.com/182/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/morgancollett.wordpress.com/182/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/morgancollett.wordpress.com/182/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/morgancollett.wordpress.com/182/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/morgancollett.wordpress.com/182/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/morgancollett.wordpress.com/182/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/morgancollett.wordpress.com/182/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/morgancollett.wordpress.com/182/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/morgancollett.wordpress.com/182/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morgancollett.wordpress.com&amp;blog=494363&amp;post=182&amp;subd=morgancollett&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-05-13T19:43:12Z</updated>
    <published>2009-05-13T19:43:12Z</published>
    <category scheme="http://morgancollett.wordpress.com" term="ubuntu"/>
    <author>
      <name>Morgan</name>
      <uri>http://morgancollett.wordpress.com/</uri>
    </author>
    <source>
      <id>http://morgancollett.wordpress.com/feed/atom/</id>
      <link href="http://morgancollett.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://wordpress.com/opensearch.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://morgancollett.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://feeds.feedburner.com/FeedingThePenguins" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle xml:lang="en">Thoughts of an Ubunut</subtitle>
      <title xml:lang="en">Feeding the Penguins</title>
      <updated>2010-02-05T12:13:51Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://confluence.za.net/blog/?p=134</id>
    <link href="http://confluence.za.net/blog/?p=134" rel="alternate" type="text/html"/>
    <link href="http://confluence.za.net/blog/?p=134#comments" rel="replies" type="text/html"/>
    <link href="http://confluence.za.net/blog/?feed=atom&amp;p=134" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Adrianna Pińska (Confluence): Get off my side; you’re making it look stupid.</title>
    <summary xml:lang="en">Update (April 2009): Holy crap!  The IEC really did get their site updated for the elections.  I almost fell off my chair.  The election results are inexplicably only available as PDFs that you have to download, but hey — baby steps.
So, if you live in South Africa and have The Internet, you [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p><em>Update (April 2009): Holy crap!  The IEC really did get their site updated for the elections.  I almost fell off my chair.  The election results are inexplicably only available as PDFs that you have to download, but hey — baby steps.</em></p>
<p>So, if you live in South Africa and have The Internet, you probably already know that <a href="http://www.elections.org.za">the IEC website</a> is crap.  It has been crap for <em>years</em>.  It used to be bizarrely malformed in anything that isn’t IE, and lots of people complained.</p>
<p>Recently the IEC <em>dramatically improved</em> the situation by adding a browser check to their main page, and redirecting any browsers that don’t identify themselves as IE to <a href="http://www.elections.org.za/Netscape.htm">an apologetic note</a> which explains that the site  doesn’t work in anything except IE.  Please note that they had time to add Google Chrome to the list of other browsers — but not to actually fix the damn site; something which you might think is not rocket science, or very expensive to do, especially in this age of out-of-the-box CMSes and web development frameworks.</p>
<p>Of course the site still works in Firefox, exactly as badly as it used to — and the browser check is trivially circumventable.   All you have to do to see it in its full malformed glory is navigate to any internal page.  If you’re feeling energetic, you can make your browser lie in its user agent string.  Be prepared to reload frequently — not only is the site atrociously designed and basically unmaintained (how long is that &lt;\table&gt; going to be there?); the server is a bit dodgy.</p>
<p>Now, people have been complaining about this crap for years, to little effect.  Nobody seems to be particularly interested in fixing the problem.</p>
<p>Earlier today several people I know posted links to <a href="http://www.digitalapartheid.com/">DigitalApartheid.com</a>, a new site created by someone who is fed up with the state of the IEC website.  As much as I agree with the purported goals of the site, I am not impressed with the way it has gone about achieving them, for several reasons.</p>
<p>One: the site instructs visitors to email or fax a <em>form letter</em> complaining about the site to various employees of the IEC.  Form letters are crap.  Form letters say “I’m not capable of articulating an intelligent opinion about this; I’m with that guy, so I copied what he said.”  I wouldn’t be surprised if they were forwarded straight to /dev/dustbin at the IEC; I know that’s what I’d do.</p>
<p>Two: the form letter is full of bad punctuation and grammar.  Badly written complaints make you look stupid.</p>
<p>Three: the form letter compares the site’s exclusion of non-IE users to apartheid, and states that the writer is contemplating not voting unless the site is fixed.  Here’s where we go off the deep end.</p>
<p>Seriously?  You really think that the inconvenience that you experience at this site because of your (admirable and sensible) choice to use a browser other than IE is comparable to decades of racist government oppression?</p>
<p>Dude.  Maybe you should get some perspective.</p>
<p>Most people in South Africa don’t have access to computers.  The IEC website is not the only — or indeed the primary — source of information about the elections.  This information is not being <em>denied</em> to you — if you can’t access it in your browser (and you can, really), you have the ability to get it in some other way, just like all those computerless people.</p>
<p>I do want the IEC to fix their site — but bombarding them with ridiculous hyperbole isn’t going to make them do it.  There are plenty of intelligent things to say about standards compliance and FOSS, and why they are important.  If you’re going to send a complaint, please do it in a way which doesn’t make you — and by association everyone else who uses an alternative browser — look like a raving nutjob.</p></div>
    </content>
    <updated>2009-04-24T11:52:03Z</updated>
    <published>2008-11-04T17:08:48Z</published>
    <category scheme="http://confluence.za.net/blog" term="Rants"/>
    <category scheme="http://confluence.za.net/blog" term="Tech and coding"/>
    <author>
      <name>confluence</name>
      <uri>http://confluence.za.net</uri>
    </author>
    <source>
      <id>http://confluence.za.net/blog/?feed=atom</id>
      <link href="http://confluence.za.net/blog" rel="alternate" type="text/html"/>
      <link href="http://confluence.za.net/blog/?cat=22&amp;feed=atom" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">Powered by space monkeys!</subtitle>
      <title xml:lang="en">Confluence » Tech and coding</title>
      <updated>2009-11-23T08:39:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://morgancollett.wordpress.com/?p=179</id>
    <link href="http://morgancollett.wordpress.com/2009/04/23/surviving-an-ubuntu-release-day/" rel="alternate" type="text/html"/>
    <link href="http://morgancollett.wordpress.com/2009/04/23/surviving-an-ubuntu-release-day/#comments" rel="replies" type="text/html"/>
    <link href="http://morgancollett.wordpress.com/2009/04/23/surviving-an-ubuntu-release-day/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Morgan Collett (morgs): Surviving an Ubuntu Release Day</title>
    <summary type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml">Some observations on the last n releases:
Throughout the Ubuntu development cycle, there are daily “snapshot” CD images produced. If you’re fortunate to live in a country where most of the “broadband” online population are not capped at 1GB per month (and a presidential hopeful who doesn’t keep singing “bring me my machine gun“) then you [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morgancollett.wordpress.com&amp;blog=494363&amp;post=179&amp;subd=morgancollett&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>Some observations on the last n releases:</p>
<p>Throughout the Ubuntu development cycle, there are <a href="http://cdimage.ubuntu.com/">daily “snapshot” CD images</a> produced. If you’re fortunate to live in a country where most of the “broadband” online population are not capped at 1GB per month (and a presidential <acronym title="The votes are being counted as I write this, and he doesn't need much hope">hopeful</acronym> who doesn’t keep singing “<a href="http://en.wikipedia.org/wiki/Umshini_wami">bring me my machine gun</a>“) then you can download these during the development cycle to boot (<a href="http://cdimage.ubuntu.com/daily-live/">daily-live</a>) or install (perhaps in a virtual machine) to check on the progress or help with testing. These culminate in the actual “gold” release image.</p>
<p>Therefore, if you have one of these images from near the end of the development cycle, such as the release candidate, you can <a href="https://help.ubuntu.com/community/RsyncCdImage">rsync to the latest image</a> available on release day, and that will download the differences between the iso you have, and the final daily image – which will be identical to the release image, even though the daily image will be named something like <em>jaunty-desktop-i386.iso</em> and the corresponding release image named <em>ubuntu-9.04-desktop-i386.iso</em>. Rename it, and you’re done!</p>
<p>(Check the <a href="http://releases.ubuntu.com/jaunty/MD5SUMS">MD5SUMS</a> after the release is announced, to be 100% sure you have it. There is always a small chance of a change to the ISOs on release day if some major “ate all my data” bug is found – so if you do have problems, remember that it comes with <a href="http://www.gnu.org/copyleft/gpl.html">no warranty</a>…)</p>
<p>Now, for kicks, go and lurk on IRC in #ubuntu-release-party and watch the masses rocking up to ask “<a href="http://popey.com/Is_it_out_yet">Is it out yet</a>?” Note Alan Pope’s list of <a href="http://popey.com/Things_Not_To_Say">Things Not To Say</a>, and don’t go gloating that you have it already – you’ll only be kicked from the channel by the ironically named partybot.</p>
<p>Instead, <span style="text-decoration: line-through;">burn</span> write it to a USB stick (CDs are so early 2008) and get installing!</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/morgancollett.wordpress.com/179/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/morgancollett.wordpress.com/179/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/morgancollett.wordpress.com/179/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/morgancollett.wordpress.com/179/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/morgancollett.wordpress.com/179/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/morgancollett.wordpress.com/179/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/morgancollett.wordpress.com/179/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/morgancollett.wordpress.com/179/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/morgancollett.wordpress.com/179/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/morgancollett.wordpress.com/179/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=morgancollett.wordpress.com&amp;blog=494363&amp;post=179&amp;subd=morgancollett&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-04-23T18:46:54Z</updated>
    <published>2009-04-23T18:46:54Z</published>
    <category scheme="http://morgancollett.wordpress.com" term="ubuntu"/>
    <author>
      <name>Morgan</name>
      <uri>http://morgancollett.wordpress.com/</uri>
    </author>
    <source>
      <id>http://morgancollett.wordpress.com/feed/atom/</id>
      <link href="http://morgancollett.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://wordpress.com/opensearch.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://morgancollett.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://feeds.feedburner.com/FeedingThePenguins" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle xml:lang="en">Thoughts of an Ubunut</subtitle>
      <title xml:lang="en">Feeding the Penguins</title>
      <updated>2010-02-05T12:13:51Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://michael.gorven.za.net/blog/2009/04/12/serving-static-files-without-file-extensions-using-lighttpd-lua</id>
    <link href="http://michael.gorven.za.net/blog/2009/04/12/serving-static-files-without-file-extensions-using-lighttpd-lua" rel="alternate" type="text/html"/>
    <title>Michael Gorven (cocooncrash): Serving static files without file extensions using Lighttpd and Lua</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://en.wikipedia.org/wiki/Uniform_Resource_Locator"><abbr title="uniform resource locator">URL</abbr></a>s shouldn't really contain file extensions (like <span class="geshifilter"><code class="text geshifilter-text">.html</code></span>, <span class="geshifilter"><code class="text geshifilter-text">.png</code></span>)
since they are supposed to identify a resource and not a particular
representation/format thereof. The format is indicated by the <span class="geshifilter"><code class="text geshifilter-text">Content-Type</code></span>
header sent in the response. Modern <a href="http://en.wikipedia.org/wiki/Content_management_system"><abbr title="content management system">CMS</abbr></a>s do this already (for example, the
<abbr title="uniform resource locator">URL</abbr> of this page doesn't include <span class="geshifilter"><code class="text geshifilter-text">.html</code></span>).</p>

<p>Doing the same for static files (i.e. files served directly by the webserver)
isn't straightforward because most webservers use the file extension to
determine the <a href="http://en.wikipedia.org/wiki/Mime_type">MIME type</a> to send in the <span class="geshifilter"><code class="text geshifilter-text">Content-Type</code></span> header. This means
that simply removing the file extension from the filename (or even creating a
symlink without a file extension) will cause the webserver to send the wrong
<span class="geshifilter"><code class="text geshifilter-text">Content-Type</code></span> header.</p>

<p>I decided to try find a solution to this for my webserver of choice,
<a href="http://en.wikipedia.org/wiki/Lighttpd">Lighttpd</a>. Lighttpd has a <a href="http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModMagnet">module</a> which embeds a <a href="http://en.wikipedia.org/wiki/Lua_(programming_language)">Lua</a> interpreter and
allows you to write scripts which modify (or even handle) requests. So I wrote
a <a href="http://michael.gorven.za.net/files/extension.lua">script</a> which searches the directory for files with the same name as
requested but with an extension. This means that any file can be accessed with
the file extension removed from the <abbr title="uniform resource locator">URL</abbr> while still having the correct
<span class="geshifilter"><code class="text geshifilter-text">Content-Type</code></span>.</p>

<p>The script currently chooses the first matching file, which means that having
multiple files with the same name but different extensions doesn't do anything
useful. The proper method however is to actually do <a href="http://en.wikipedia.org/wiki/Content_negotiation">content negotiation</a>,
which chooses the format based on the preferences indicated by the HTTP client
in the <span class="geshifilter"><code class="text geshifilter-text">Accept</code></span> header.</p>

<p>To use this script, download it and save it somewhere (I use <span class="geshifilter"><code class="text geshifilter-text">/etc/lighttpd/</code></span>).
Enable <span class="geshifilter"><code class="text geshifilter-text">mod_magnet</code></span>, and add the following line to the site definition.</p>

<p/><pre><div class="geshifilter"><pre class="text geshifilter-text" style="font-family: monospace;">magnet.attract-physical-path-to = ("/etc/lighttpd/extension.lua")</pre></div></pre><p/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://en.wikipedia.org/wiki/Uniform_Resource_Locator"><abbr title="uniform resource locator">URL</abbr></a>s shouldn't really contain file extensions (like <code>.html</code>, <code>.png</code>)
since they are supposed to identify a resource and not a particular
representation/format thereof. The format is indicated by the <code>Content-Type</code>
header sent in the response. Modern <a href="http://en.wikipedia.org/wiki/Content_management_system"><abbr title="content management system">CMS</abbr></a>s do this already (for example, the
<abbr title="uniform resource locator">URL</abbr> of this page doesn't include <code>.html</code>).</p>

<p>Doing the same for static files (i.e. files served directly by the webserver)
isn't straightforward because most webservers use the file extension to
determine the <a href="http://en.wikipedia.org/wiki/Mime_type">MIME type</a> to send in the <code>Content-Type</code> header. This means
that simply removing the file extension from the filename (or even creating a
symlink without a file extension) will cause the webserver to send the wrong
<code>Content-Type</code> header.</p>

<p>I decided to try find a solution to this for my webserver of choice,
<a href="http://en.wikipedia.org/wiki/Lighttpd">Lighttpd</a>. Lighttpd has a <a href="http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModMagnet">module</a> which embeds a <a href="http://en.wikipedia.org/wiki/Lua_(programming_language)">Lua</a> interpreter and
allows you to write scripts which modify (or even handle) requests. So I wrote
a <a href="http://michael.gorven.za.net/files/extension.lua">script</a> which searches the directory for files with the same name as
requested but with an extension. This means that any file can be accessed with
the file extension removed from the <abbr title="uniform resource locator">URL</abbr> while still having the correct
<code>Content-Type</code>.</p>

<p>The script currently chooses the first matching file, which means that having
multiple files with the same name but different extensions doesn't do anything
useful. The proper method however is to actually do <a href="http://en.wikipedia.org/wiki/Content_negotiation">content negotiation</a>,
which chooses the format based on the preferences indicated by the HTTP client
in the <code>Accept</code> header.</p>

<p>To use this script, download it and save it somewhere (I use <code>/etc/lighttpd/</code>).
Enable <code>mod_magnet</code>, and add the following line to the site definition.</p>

<pre><code>magnet.attract-physical-path-to = ("/etc/lighttpd/extension.lua")
</code></pre></div>
    </content>
    <updated>2009-04-13T15:39:28Z</updated>
    <published>2009-04-12T11:49:25Z</published>
    <category term="code"/>
    <category term="http"/>
    <category term="lighttpd"/>
    <category term="lua"/>
    <category term="technical"/>
    <author>
      <name>mgorven</name>
    </author>
    <source>
      <id>http://michael.gorven.za.net/taxonomy/term/3/atom/feed</id>
      <link href="http://michael.gorven.za.net/tags/technical" rel="alternate" type="text/html"/>
      <link href="http://michael.gorven.za.net/taxonomy/term/3/atom/feed" rel="self" type="application/atom+xml"/>
      <subtitle>Posts containing technical information.</subtitle>
      <title>technical</title>
      <updated>2008-10-01T15:12:23Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.arbitraryuser.com/blog/?p=508</id>
    <link href="http://www.arbitraryuser.com/blog/2009/03/24/visualising-the-interest-rate/" rel="alternate" type="text/html"/>
    <link href="http://www.arbitraryuser.com/blog/2009/03/24/visualising-the-interest-rate/#comments" rel="replies" type="text/html"/>
    <link href="http://www.arbitraryuser.com/blog/2009/03/24/visualising-the-interest-rate/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Jonathan Endersby (nlt): Visualising the Interest Rate</title>
    <summary xml:lang="en">I though it might be interesting to try and graph the Reserve Bank’s prime rate data… It goes back a long way. I used Python to scrape and collate the data and PyCha to generate the graph.
UPDATE: I’ve replaced my graphs with new versions made by Russell who corrected my original code by interpolating the [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>I though it might be interesting to try and graph the Reserve Bank’s <a href="http://www.reservebank.co.za/internet/Historicdata.nsf/Mainpage?OpenPage&amp;Click=42256DA4002CFF0E.29d44b91ee5b4df442256d860053d613/$Body/0.DF0">prime rate data</a>… It goes back a long way. I used Python to scrape and collate the data and PyCha to generate the graph.</p>
<p>UPDATE: I’ve replaced my graphs with new versions made by <a href="http://russell.rucus.net/">Russell</a> who corrected my original code by interpolating the data correctly over the y axis.</p>
<p>This is the narrow version.<br/>
<img src="http://www.arbitraryuser.com/blog/wp-content/uploads/2009/03/narrow1.png"/><br/>
And this is the wide version (click to download the actual 10000px wide png)<br/>
<a href="http://www.arbitraryuser.com/blog/wp-content/uploads/2009/03/wide_interest1.png" rel="lightbox[508]"><img alt="" class="alignnone size-full wp-image-517" height="12" src="http://www.arbitraryuser.com/blog/wp-content/uploads/2009/03/wide_interest1.png" title="wide_interest1" width="500"/></a></p>
<p>Interestingly enough, todays rate cut *was* on that page earlier today, but now I see it’s gone… so I inserted it manually ;)</p></div>
    </content>
    <updated>2009-03-24T20:05:42Z</updated>
    <published>2009-03-24T17:39:43Z</published>
    <category scheme="http://www.arbitraryuser.com/blog" term="Aggregate This"/>
    <category scheme="http://www.arbitraryuser.com/blog" term="Property"/>
    <category scheme="http://www.arbitraryuser.com/blog" term="Tech"/>
    <author>
      <name>arbitraryuser</name>
      <uri>http://www.arbitraryuser.com/blog/wp-atom.php</uri>
    </author>
    <source>
      <id>http://www.arbitraryuser.com/blog/feed/atom/</id>
      <link href="http://www.arbitraryuser.com/blog" rel="alternate" type="text/html"/>
      <link href="http://www.arbitraryuser.com/blog/category/tech/feed/atom/" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">Jonathan Endersby, Recovering Technologist</subtitle>
      <title xml:lang="en">arbitrary user » Tech</title>
      <updated>2010-03-15T09:08:26Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.arbitraryuser.com/blog/?p=499</id>
    <link href="http://www.arbitraryuser.com/blog/2009/02/11/there-is-no-cure-for-stupidity/" rel="alternate" type="text/html"/>
    <link href="http://www.arbitraryuser.com/blog/2009/02/11/there-is-no-cure-for-stupidity/#comments" rel="replies" type="text/html"/>
    <link href="http://www.arbitraryuser.com/blog/2009/02/11/there-is-no-cure-for-stupidity/feed/atom/" rel="replies" type="application/atom+xml"/>
    <title xml:lang="en">Jonathan Endersby (nlt): There is no cure for stupidity.</title>
    <summary xml:lang="en">A while ago I blogged about a weird comment I had received on one of my blog posts.
In summary, there is an SEO company called SEO Results (aka BizSearch, aka NetAge) that gets its staff to trawl blogs and write comments with the Author URL set to the url of one of their SEO clients.
Author [...]</summary>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>A while ago I <a href="http://www.arbitraryuser.com/blog/2008/10/30/funny-moment-from-my-life-5694/">blogged about</a> a weird comment I had received on one of my blog posts.</p>
<p>In summary, there is an SEO company called <a href="http://www.seoresults.co.za/" rel="nofollow">SEO Results</a> (aka BizSearch, aka NetAge) that gets its staff to trawl blogs and write comments with the Author URL set to the url of one of their SEO clients.</p>
<blockquote><p>Author : PMM (IP: 165.146.34.239 , dsl-146-34-239.telkomadsl.co.za)<br/>
E-mail : kim@bizsearch.co.za<br/>
URL    : http://www.pmmproperties.co.za<br/>
Comment:<br/>
Wow what a difference it looks fantastic, great job done</p></blockquote>
<p>One would think that after the first run in I had with these spammers they would have avoided my blog?</p>
<p>Anyway, to make sure it’s clear: SEO Results are spammers and black hat SEO idiots… Using them is likely to get you bad mouthed on the internet (like this) and perhaps worse, blacklisted on google.</p></div>
    </content>
    <updated>2009-02-11T10:35:20Z</updated>
    <published>2009-02-11T10:33:44Z</published>
    <category scheme="http://www.arbitraryuser.com/blog" term="Aggregate This"/>
    <category scheme="http://www.arbitraryuser.com/blog" term="Tech"/>
    <author>
      <name>arbitraryuser</name>
      <uri>http://www.arbitraryuser.com/blog/wp-atom.php</uri>
    </author>
    <source>
      <id>http://www.arbitraryuser.com/blog/feed/atom/</id>
      <link href="http://www.arbitraryuser.com/blog" rel="alternate" type="text/html"/>
      <link href="http://www.arbitraryuser.com/blog/category/tech/feed/atom/" rel="self" type="application/atom+xml"/>
      <subtitle xml:lang="en">Jonathan Endersby, Recovering Technologist</subtitle>
      <title xml:lang="en">arbitrary user » Tech</title>
      <updated>2010-03-15T09:08:26Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://whijo.net/461 at http://whijo.net</id>
    <link href="http://whijo.net/blog/brad/2008/12/01/syncing-your-s60.html" rel="alternate" type="text/html"/>
    <title>Bradley Whittington (D-Arb): Syncing your S60</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Recently I upgraded my phone to a <a href="http://www.gsmarena.com/nokia_n81-2084.php">Nokia N81</a>. I set up my <a href="http://zyb.com">Zyb</a> account, and sync'd my contacts, and realised that I could not schedule syncs like I had with my SE w810i. Until this morning, when <a href="http://russell.rucus.net">Russell</a> pointed out on IRC that there was a tool for that exact thing: <a href="http://code.google.com/p/bergamot/wiki/Swim">Swim</a> is a utility for automatic periodic synchronization of data with internet servers. It is part of the opensource project called Bergemot. The only hurdle is that you have to get the SIS file signed by the <a href="https://www.symbiansigned.com/app/page/public/openSignedOnline.do">Open Signed Online</a> and when you install it you are presented with a warning that your phone may turn into a lump of metal because you are using <em>Software In Development</em>. Works fine for me though.</p></div>
    </summary>
    <updated>2008-11-30T22:16:49Z</updated>
    <category scheme="http://whijo.net/tags/geek" term="geek"/>
    <category scheme="http://whijo.net/geek-tags/n81" term="n81"/>
    <category scheme="http://whijo.net/geek-tags/nokia" term="nokia"/>
    <category scheme="http://whijo.net/geek-tags/s60" term="s60"/>
    <category scheme="http://whijo.net/geek-tags/swim" term="swim"/>
    <author>
      <name>brad</name>
    </author>
    <source>
      <id>http://whijo.net/taxonomy/term/27/feed</id>
      <link href="http://whijo.net/taxonomy/term/27/feed" rel="alternate" type="text/html"/>
      <link href="http://whijo.net/taxonomy/term/27/feed" rel="self" type="application/rss+xml"/>
      <subtitle>The taxonomy view with a depth of 0.</subtitle>
      <title>geek</title>
      <updated>2009-10-08T09:05:54Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://whijo.net/460 at http://whijo.net</id>
    <link href="http://whijo.net/blog/brad/2008/11/22/telkom-awesome.html" rel="alternate" type="text/html"/>
    <title>Bradley Whittington (D-Arb): Telkom is awesome.</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In a week we are moving houses. We have a list of things that need to be sorted before we move. So, one of the things on the list is moving our phone line/ADSL. I have a <a href="http://cybersmart.co.za/adslapplyoneprice.cgi?circuit=384&amp;&amp;cap=3">one price ADSL from cybersmart</a> so I can take advantage of their <a href="http://cybersmart.co.za/nightrider.cgi">Night Rider</a> plan. Little did I know, paying for our ADSL portion from another supplier was something Telkom Just Couldn't Handle during a transfer.</p>
<p>I phoned Telkom's 10219 number, and was told I needed to call a random number to have the transfer done, because there was an ADSL linked to it. So we tried the cybersmart route. Mandy phoned and asked if we could have the line moved. Cybersmart wasn't so sure. So, we tried Telkom again. After some lengthly discussions Telkom came back with the point that the ISP has to initiate the move. So, back to cybersmart. This time cybersmart was helpful, and said I just needed to fax them my details and request, and they could go ahead, provided they had my signature. Cybersmart phoned back a few days later to tell me the fax was quite light, so they couldn't make out much. After chatting to the very helpful cybersmarter, she said she could transfer the ADSL portion back to Telkom, and then I could handle the transfer, and once it was complete Cybersmart could migrate the line back. Convoluted, but Telkom understandable. Took a few days, but today the migration went through, and round 2 started.</p>
<p>I phoned Telkom, and the very helpful call centre person started to sort me out. No charges, just time. I thought I was on the home run. Then I pointed out that the line had an ADSL on it, and I wouldn't mind having the number changed. Apparently it costs R543.23 to transfer an ADSL line between premises. WHAT? But, doing a self-install of ADSL costs R0.00. So, after some protracted negotiations, the path became clear:</p>
<p>Cancel my ADSL portion ("downgrade" my line), transfer to the new premises (and because there is no ADSL associated I can roll in a phone number change), once the line is active in the new house, then I can re-initiate the ADSL portion for free. WOW.</p>
<p>It's like peeling layers off an onion, and then putting the onion back together. Through all of this the call centre people were lank nice and helpful, but the system gets me down.</p>
<p>Just to re-cap, to have ADSL and a phone line moved to my new house (which is about 1km away from my old one) I have to:<br/>
Instruct Cybersmart to migrate my ADSL back to Telkom, Ask Telkom to cancel my ADSL, Ask Telkom to move my phone line to my new house, Wait for the new line, Ask Telkom to "upgrade" my line to include ADSL, transfer the ADSL back to Cybersmart. Awesome system guys.</p></div>
    </summary>
    <updated>2008-11-22T03:57:58Z</updated>
    <category scheme="http://whijo.net/geek-tags/adsl" term="adsl"/>
    <category scheme="http://whijo.net/geek-tags/cybersmart" term="cybersmart"/>
    <category scheme="http://whijo.net/tags/geek" term="geek"/>
    <category scheme="http://whijo.net/tags/south-africa" term="south africa"/>
    <category scheme="http://whijo.net/geek-tags/telkom" term="telkom"/>
    <author>
      <name>brad</name>
    </author>
    <source>
      <id>http://whijo.net/taxonomy/term/27/feed</id>
      <link href="http://whijo.net/taxonomy/term/27/feed" rel="alternate" type="text/html"/>
      <link href="http://whijo.net/taxonomy/term/27/feed" rel="self" type="application/rss+xml"/>
      <subtitle>The taxonomy view with a depth of 0.</subtitle>
      <title>geek</title>
      <updated>2009-10-08T09:05:54Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://whijo.net/454 at http://whijo.net</id>
    <link href="http://whijo.net/blog/brad/2008/10/10/responsible-reporting-or-sorry-being-doos-clickthinking.html" rel="alternate" type="text/html"/>
    <title>Bradley Whittington (D-Arb): Responsible reporting (or, sorry for being a doos, ClickThinking)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Yesterday I posted about how a <a href="http://whijo.net/node/453">local web company recently sold</a> the work of a well known, local, independent <a href="http://coda.co.za">web professional</a>. What they did broke netiquette, ethics, and definitely copyright law. Much geek froth and outrage occurred, and a tiny storm broke out on the internet. I jumped on the bandwagon with my post because:</p>
<ol>
<li>I have <acronym title="Someone is wrong on the internet">SIWOTI</acronym> <a href="http://xkcd.com/386/">syndrome</a></li>
<li>Content climbs higher on google when lots of reputable sources link to what is considered to be definitive text. Whijo is considered to be somewhat of a reputable source by google, and because I use <a href="http://drupal.org">the best CMS on the internet</a> google likes reading what I am writing, so I wanted to contribute to improving Coda's rank on google for this subject</li>
<li>My goal is to improve the quality of the South African web, and improvement/evolution comes when the economy/environment favours better products, and denounces poor product. I denounced poor product</li>
</ol>
<p>The only problem is that sometimes success quickly exceeds expectation, and in this case, after google crawled whijo.net, my article (then entitled 'Do not use the services of ClickThinking') landed on the first page of results. Coda's much more democratic '<a href="http://coda.co.za/blog/2008/10/09/clickthinking-what-were-you-thinking">What were you thinking, ClickThinking?</a>' reached higher on the first page of results, as it should have. So, geek-google-penis aside, the weight of what I had done (measured in the internet based ISO standard of LOLCATS, or Lc) struck me. I know it is all a storm in a tea cup, but a post with a title as <a href="http://www.arbitraryuser.com/blog/2006/12/21/do-not-eat-at-nonna-lina/">venomous as that sticks around</a>, and ultimately may take business from them (and I am in no position to decide if their poor form deserves to take business away from them). I had behaved like a Journalist (well, one who didn't do too well in the media and ethics course). I thought up a catchy headline, and published it with a self-congratulatory click. I guess it comes back to thinking before doing, and not being a turd on the internet. So I changed the title, and when the site is re-crawled it will have a new title which is a lot closer to the heart of the matter at hand, and a lot less sensationalist. </p>
<p>Sometimes my powerful Sense For Injustice conspires with my Sense For Bad Web Development, and I peak too soon, type before I think, and end up looking childish, and not accomplishing my goals. I am usually calm and rational, but some things short circuit over that calm, rational, ethical brain. So, in summation, I apologise to ClickThinking for going too far off the handle, but I still deplore what they did.</p>
<p>As an aside, should I really be able to get into the first page of results on google for a company that just won a web analytics award?</p></div>
    </summary>
    <updated>2008-10-10T01:23:27Z</updated>
    <category scheme="http://whijo.net/geek-tags/clickthinking" term="ClickThinking"/>
    <category scheme="http://whijo.net/tags/ethics" term="ethics"/>
    <category scheme="http://whijo.net/tags/geek" term="geek"/>
    <category scheme="http://whijo.net/geek-tags/internet" term="internet"/>
    <author>
      <name>brad</name>
    </author>
    <source>
      <id>http://whijo.net/taxonomy/term/27/feed</id>
      <link href="http://whijo.net/taxonomy/term/27/feed" rel="alternate" type="text/html"/>
      <link href="http://whijo.net/taxonomy/term/27/feed" rel="self" type="application/rss+xml"/>
      <subtitle>The taxonomy view with a depth of 0.</subtitle>
      <title>geek</title>
      <updated>2009-10-08T09:05:54Z</updated>
    </source>
  </entry>
</feed>
