<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2664598839700315760</id><updated>2012-01-31T16:42:09.142+11:00</updated><category term='python'/><category term='extjs'/><title type='text'>My Own Hat</title><subtitle type='html'>A technical blog which contains personal opinions. Major topic areas will include the Python language and other technologies of note.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>86</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-9113220772189201034</id><published>2012-01-31T12:31:00.000+11:00</published><updated>2012-01-31T12:31:09.095+11:00</updated><title type='text'>Why doesn't my circuit work?</title><content type='html'>Okay, so I finally managed to build something that didn't work! This is actually neat, since it represents a problem-solving challenge to be overcome, and something that goes beyond colouring in the lines. Well, apparently I couldn't colour in the lines, which is how I got here.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-AKgpVZXPed8/TyPNnqRL_4I/AAAAAAAAAcE/-m6Fc9TQIBE/s1600/DSCN0212.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-AKgpVZXPed8/TyPNnqRL_4I/AAAAAAAAAcE/-m6Fc9TQIBE/s320/DSCN0212.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It looks like a fairly simple circuit. Basically, the motor is connected to ground at one end, and via a transistor to a 5V source at the other. Pin 9 there goes to the transistor, so pulsing that slowly ought to turn the motor on and off. There is also a diode, and I don't know what the hell it's for. To be more accurate, I don't know why it's necessary here, or what it's doing in this circuit. In general, the concept seems straitforward enough. I'm also not 100% confident I have the diode, the transistor or the various resistors the right way around.&lt;br /&gt;&lt;br /&gt;The resistors, I'm pretty sure, could get plugged in backwards and still operate normally. The diode I realise will simply not allow current passed if plugged in backwards. Given that if I skip the transistor the motor spins, the diode 'must' be the right way in (assuming it's working correctly). So the fault seems to be with the transistor.&lt;br /&gt;&lt;br /&gt;However, no matter how I connect the &amp;nbsp;transistor, it doesn't work correctly. One way, the motor is dead. The other way, the motor spins constantly. Total ignoring of the collector (Pin 9 there). Question: is it possible to break a transistor by sending current the wrong way through? How about with diodes?&lt;br /&gt;&lt;br /&gt;Now, I did check. The transistor in NPN, which as far as I can tell translates as "on by default", so there is one explanation: Pin 9 is broken. I tried Pin 6, no luck. So I tried coding up a flashing LED to match the Pin 9 signal. The LED flashes as required, so unless both Pin 9 and Pin 6 are physically damaged on the Arduino, it shouldn't be that.&lt;br /&gt;&lt;br /&gt;So, now I'm stuck. Without a multimeter (or maybe just some LEDs and alligator clips) I'm pretty much unable to determine which parts of my circuit are receiving the expected current. Did I short something out? Is my diode in backwards? What current is coming out of Pin 9?&lt;br /&gt;&lt;br /&gt;Answers to all these exciting newbie questions, and more, in weeks to come.&lt;br /&gt;&lt;br /&gt;In the meantime, to all you electrical engineers out there, I hope you enjoyed this brief sojourn into electrical bafflement :)&lt;br /&gt;&lt;br /&gt;PS: Some people who spotted these photos on G+ have pointed out that the diode is likely present to protect against a back-spike of power coming FROM the motor as it spins down.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-9113220772189201034?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/9113220772189201034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=9113220772189201034' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9113220772189201034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9113220772189201034'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2012/01/why-doesnt-my-circuit-work_31.html' title='Why doesn&apos;t my circuit work?'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-AKgpVZXPed8/TyPNnqRL_4I/AAAAAAAAAcE/-m6Fc9TQIBE/s72-c/DSCN0212.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5860495015517566203</id><published>2012-01-28T21:42:00.001+11:00</published><updated>2012-01-28T21:42:00.138+11:00</updated><title type='text'>Assembling the chassis</title><content type='html'>This post is going to document the assembling of the chassis. I purchased the &lt;a href="http://littlebirdelectronics.com/products/magician-chassis"&gt;Magician Chassis&lt;/a&gt;&amp;nbsp;as the basis for my bot. Assembly was mostly straightforward, although I did need to do just a little hackwork along the way to bring it together. The finished product looks like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-z7dVZyL8s1U/TxjjViCSpqI/AAAAAAAAARw/ADFgBZX5Sa8/w648-h486-k/2012+-+1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-z7dVZyL8s1U/TxjjViCSpqI/AAAAAAAAARw/ADFgBZX5Sa8/w648-h486-k/2012+-+1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It's not the greatest photo ever, but you get the idea. There are two motors, one attached to each large wheel. There is an additional rear "trackball" thing which bears the weight of the rear end. The construction is sturdy-ish. Certainly it doesn't seem like it's going to break during construction, but it should definitely not suffer a drop.&lt;br /&gt;&lt;br /&gt;The kit comes with instructions, which kind of mostly cover what you need to know. In addition to the instructions and this blog post, there is a similar blog post available here:&amp;nbsp;&lt;a href="http://www.hobbytronics.co.uk/magician-chassis-build"&gt;http://www.hobbytronics.co.uk/magician-chassis-build&lt;/a&gt;. It's probably more useful than this post, but this is my story :)&lt;br /&gt;&lt;br /&gt;Here is a photo of the kit parts, unassembled:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-E2bwx7ELEEg/Txje1_O1pgI/AAAAAAAAAQQ/opPme3EX5uo/w648-h486-k/2012+-+1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-E2bwx7ELEEg/Txje1_O1pgI/AAAAAAAAAQQ/opPme3EX5uo/w648-h486-k/2012+-+1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;The process begins by attaching the motors. This turns out to be medium level tricky, where easy is "goes according to the instructions" and hard would be "I basically had to MacGuyver it from first principles". My main issue was there there are some little red things which look like gears which attach to a spindle on the side of the motor. THESE APPEAR TO HAVE NO FUNCTION. Even after assembly, no function.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-oCSFCt9cjv4/TxjgRuDs18I/AAAAAAAAARY/dbC3LWV0YMU/w648-h486-k/2012+-+1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-oCSFCt9cjv4/TxjgRuDs18I/AAAAAAAAARY/dbC3LWV0YMU/w648-h486-k/2012+-+1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can see the red thing here. One of my red things needed to have the whole expanded carefully with a Stanley knife in order to accept the spindle. Bolting the struts on was not too bad, although it's a darn tight fit. I had to rotate the struts 180 degrees even though they look pretty symmetrical. They do go on. Anyone who knows what those red things are for, please let me know.&lt;br /&gt;&lt;br /&gt;Attaching the wheels is a matter of shoving them onto the outside spindle of each engine. They don't fit very well (no satisfying push... click). So I hope they don't come off, but it seems okay.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fHvWvxETlvs/TxjgBeTLf5I/AAAAAAAAARA/VD_HhziKNiw/w648-h486-k/2012+-+1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-fHvWvxETlvs/TxjgBeTLf5I/AAAAAAAAARA/VD_HhziKNiw/w648-h486-k/2012+-+1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Attaching the trackball is super easy. No worries there, although I might lubricate the socket at some point. The base is now completed! The leads running off the motors strike me as a bit of a catching hazard, I think it would be better to put some electrical tape on to help run them up to the upper level where they will attach to the Arduino later on, but I'll do that at another point in time.&lt;br /&gt;&lt;br /&gt;The next step is to put the base right-way-up and attach the battery housing. The battery housing is terrible quality, and in a stupid place. The worst thing about it is that the screw-holes are so close to the edge that you can't actually put a screw in. I had to cut down the edges with a Stanley knife. I hope this isn't a problem later.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-RZTP-ANT_pc/TxjmIwNFJUI/AAAAAAAAASE/0nh8SkPx1zc/w648-h486-k/2012+-+1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-RZTP-ANT_pc/TxjmIwNFJUI/AAAAAAAAASE/0nh8SkPx1zc/w648-h486-k/2012+-+1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;See the screw? You can see it through the hole I cut to allow the head through.&lt;br /&gt;&lt;br /&gt;From here, it's a doddle to finish assembly. Screwing on the spacers and the top level is super-easy, leading to the finished product:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-StNyT8koC8g/TxjeWAudJfI/AAAAAAAAAP4/BO7MDRR3W80/w648-h486-k/2012+-+1" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-StNyT8koC8g/TxjeWAudJfI/AAAAAAAAAP4/BO7MDRR3W80/w648-h486-k/2012+-+1" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you can see, the battery housing is in a near-inaccessible location. The HobbyTronics post I linked to earlier said they pulled it out and housed it on the top level, which certainly makes sense. However, I figure I should follow the rules before breaking them, so there is the finished product!&lt;br /&gt;&lt;br /&gt;Of course, right now it doesn't DO anything, because I haven't wired up any power or attached the Arduino to control the motors. However, it was a great evening's work and took a little under two hours from fetching my equipment to a finished product and a clean workbench again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5860495015517566203?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5860495015517566203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5860495015517566203' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5860495015517566203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5860495015517566203'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2012/01/assembling-chassis.html' title='Assembling the chassis'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-2489598139110759755</id><published>2012-01-20T17:49:00.000+11:00</published><updated>2012-01-20T15:16:44.162+11:00</updated><title type='text'>Some inspirational material</title><content type='html'>This video does a fantastic job of expressing the sentiment and excitement around building a basic autonomous robot....&lt;br /&gt;&lt;br /&gt;http://t.co/6ioJYoCI&lt;br /&gt;&lt;br /&gt;Thanks, that guy! (&lt;a href="http://www.instructables.com/member/Brandon121233/"&gt;http://www.instructables.com/member/Brandon121233/&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-2489598139110759755?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/2489598139110759755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=2489598139110759755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2489598139110759755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2489598139110759755'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2012/01/some-inspirational-material.html' title='Some inspirational material'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-2710753377075061228</id><published>2012-01-16T12:57:00.000+11:00</published><updated>2012-01-16T12:57:01.346+11:00</updated><title type='text'>It's here! It's here!</title><content type='html'>Okay, so now my Arduino journey can begin in earnest. Why now? Because it arrived today! Squeee!&lt;br /&gt;&lt;br /&gt;So, I thought a short unboxing post was in order. Obviously, I couldn't &lt;b&gt;possibly&lt;/b&gt;&amp;nbsp;wait until this evening at home to open it, so here are my on-the-desk photos. I'll follow up with some more later when I've actually had the opportunity to perform some construction or investigation.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-QmX8VRHmECg/TxOC9AhMHSI/AAAAAAAAAOE/bNXDBDyiM4I/s1600/IMG_20120116_113200.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-QmX8VRHmECg/TxOC9AhMHSI/AAAAAAAAAOE/bNXDBDyiM4I/s320/IMG_20120116_113200.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Inside the SparkFun Inventor's Kit&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-O3e5eTGddgo/TxOC49QyhOI/AAAAAAAAANs/1YgVlnykVT0/s1600/IMG_20120116_113154.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-O3e5eTGddgo/TxOC49QyhOI/AAAAAAAAANs/1YgVlnykVT0/s320/IMG_20120116_113154.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The great, the only, Arduino Uno&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-BjttPco584Y/TxOC0PcWQ_I/AAAAAAAAANU/0AkvT_M0JK0/s1600/IMG_20120116_113051.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-BjttPco584Y/TxOC0PcWQ_I/AAAAAAAAANU/0AkvT_M0JK0/s320/IMG_20120116_113051.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;I haz a "Magician Chassis", a "Sparkfun Inventor's Kit" and a "Soldering Iron". I presume that's enough to get in trouble with....&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-2710753377075061228?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/2710753377075061228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=2710753377075061228' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2710753377075061228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2710753377075061228'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2012/01/its-here-its-here.html' title='It&apos;s here! It&apos;s here!'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-QmX8VRHmECg/TxOC9AhMHSI/AAAAAAAAAOE/bNXDBDyiM4I/s72-c/IMG_20120116_113200.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7529514574031131627</id><published>2012-01-12T02:45:00.000+11:00</published><updated>2012-01-12T02:45:15.941+11:00</updated><title type='text'>Amateur robotics: getting started</title><content type='html'>So, here's the start of a blog series which I plan to use to document my tinkering with my soon-to-arrive Arduino board. For those who don't know, Arduino is an open-source electronics, um, computer board thingy with lots of i/o pins you can used for sensors and effectors. It can also be hooked up to a mobile phone (or cellphone for any North American readers), which can interface with the Arduino board. This can be done using Java, or even Python (thanks to the SL4A interpreter). No phone hacking required!&lt;br /&gt;&lt;br /&gt;So I intend to thoroughly document my process, and share it here. This is really for myself, but anyone else who is interested in amateur robotics might be interested in following along my story as a complete newbie at this stuff.&lt;br /&gt;&lt;br /&gt;So, the beginning...&lt;br /&gt;&lt;br /&gt;I just placed my order for the following items:&lt;br /&gt;&amp;nbsp;--&amp;nbsp;&lt;a href="http://littlebirdelectronics.com/products/sparkfun-inventors-kit-for-arduino"&gt;http://littlebirdelectronics.com/products/sparkfun-inventors-kit-for-arduino&lt;/a&gt;&lt;br /&gt;&amp;nbsp;--&amp;nbsp;&lt;a href="http://littlebirdelectronics.com/products/magician-chassis"&gt;http://littlebirdelectronics.com/products/magician-chassis&lt;/a&gt;&lt;br /&gt;&amp;nbsp;--&amp;nbsp;&lt;a href="http://littlebirdelectronics.com/products/ioio-for-android"&gt;http://littlebirdelectronics.com/products/ioio-for-android&lt;/a&gt;&lt;br /&gt;&amp;nbsp;--&amp;nbsp;&lt;a href="http://littlebirdelectronics.com/products/infrared-proximity-sensor-short-range-sharp-gp2d120xj00f"&gt;http://littlebirdelectronics.com/products/infrared-proximity-sensor-short-range-sharp-gp2d120xj00f&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My hope is to be able to build something like this:&lt;br /&gt;&amp;nbsp;--&amp;nbsp;&lt;a href="http://www.youtube.com/watch?feature=player_detailpage&amp;amp;v=9cVSzB8otpU#t=13s"&gt;http://www.youtube.com/watch?feature=player_detailpage&amp;amp;v=9cVSzB8otpU#t=13s&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But I'll have to start right from the very beginning:&lt;br /&gt;&amp;nbsp; --&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=fCxzA9_kg6s"&gt;http://www.youtube.com/watch?v=fCxzA9_kg6s&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7529514574031131627?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7529514574031131627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7529514574031131627' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7529514574031131627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7529514574031131627'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2012/01/amateur-robotics-getting-started.html' title='Amateur robotics: getting started'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-2339823878312130449</id><published>2012-01-11T16:02:00.002+11:00</published><updated>2012-01-11T16:02:49.921+11:00</updated><title type='text'>Self-deprecating code</title><content type='html'>I want code that will raise a warning if a method is called that hasn't been used in six months. That would be awesome. By this I mean:&lt;br /&gt;&amp;nbsp; -- A log of unused methods&lt;br /&gt;&amp;nbsp; -- A log of uses of crufty old methods which might not be reliable&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-2339823878312130449?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/2339823878312130449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=2339823878312130449' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2339823878312130449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2339823878312130449'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2012/01/self-deprecating-code.html' title='Self-deprecating code'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-1339346028252145439</id><published>2011-11-29T14:44:00.000+11:00</published><updated>2011-11-29T14:44:58.675+11:00</updated><title type='text'>An idea: an anti-framework for science</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So here's my idea: an anti-framework. I'm interested in the idea of building a framework, because it would be nice to provide a nice, standard set of libraries and modules to work in (much like the standard library, but extended to cover the scientific domain). However, the problem with building frameworks is basically the competing standards problem.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://imgs.xkcd.com/comics/standards.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://imgs.xkcd.com/comics/standards.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So here's my new idea. An anti-framework, build out of a relatively small number of de facto standard scientific components for Python (like numpy, scipy, matplotlib, I imagine there are some others) and call it something zingy. Any framework or environment which passes its unit tests in the anti-framework is then "zingy-name-compatible". You don't run with a zingy-name framework, because lots of people need more than what's in the standard framework for all sorts of reasons. It's perfectly okay for some-other-framework to &lt;i&gt;extend&lt;/i&gt;&amp;nbsp;zingy-name-framework, so long as it remains backwards-compatible with zingy-name framework.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Then, anyone building a relevant application, framework, or whatever can be zingy-compatible if they will support any tool written only using the zingy core libraries.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-1339346028252145439?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/1339346028252145439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=1339346028252145439' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1339346028252145439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1339346028252145439'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2011/11/idea-anti-framework-for-science.html' title='An idea: an anti-framework for science'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-9034331987507664546</id><published>2011-09-07T20:17:00.000+10:00</published><updated>2011-09-07T20:17:34.019+10:00</updated><title type='text'>"Inspiration is for amateurs; the rest of us just show up and get to work."</title><content type='html'>I came across this fantastic quote today, capturing something which I've always found to be true. I think I can now add this as a second item to the list of things I find to be true in the workplace. The first is that the relentless pursuit of simplicity is the only weapon we have against the complexity of what we are trying to achieve.&lt;br /&gt;&lt;br /&gt;“The advice I like to give young artists, or really anybody who’ll listen to me, is not to wait around for inspiration. Inspiration is for amateurs; the rest of us just show up and get to work. If you wait around for the clouds to part and a bolt of lightning to strike you in the brain, you are not going to make an awful lot of work. All the best ideas come out of the process; they come out of the work itself. Things occur to you. If you’re sitting around trying to dream up a great art idea, you can sit there a long time before anything happens. But if you just get to work, something will occur to you and something else will occur to you and somthing else that you reject will push you in another direction. Inspiration is absolutely unnecessary and somehow deceptive. You feel like you need this great idea before you can get down to work, and I find that’s almost never the case.” ~ Chuck Close&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sourced from:&amp;nbsp;&lt;a href="http://blog.jacquihocking.com/2011/09/07/since-cambodia-the-beginning-of-a-new-journey/"&gt;http://blog.jacquihocking.com/2011/09/07/since-cambodia-the-beginning-of-a-new-journey/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-9034331987507664546?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/9034331987507664546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=9034331987507664546' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9034331987507664546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9034331987507664546'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2011/09/inspiration-is-for-amateurs-rest-of-us.html' title='&quot;Inspiration is for amateurs; the rest of us just show up and get to work.&quot;'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7354787516009555231</id><published>2011-07-26T15:38:00.000+10:00</published><updated>2011-07-26T15:38:09.012+10:00</updated><title type='text'>Debug my tutorials (and try something new)</title><content type='html'>&lt;a href="https://bitbucket.org/tleeuwenburg/benchmarker.py/wiki/Home"&gt;https://bitbucket.org/tleeuwenburg/benchmarker.py/wiki/Home&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As I've mentioned before, I'm working on a new project for helping collect benchmarks for Python programs. To start with, only CPU performance is measured since that's the easiest data to collect, but I'd like to collect other metrics eventually. The wiki has three fairly thorough tutorials, and some more under construction. The installation of the package with easy_install seems to be working okay, and I believe all the tutorials have correctly functioning code snippets.&lt;br /&gt;&lt;br /&gt;If you have an interest in collecting performance data on your Python program, maybe you would be happy to work through the tutorials and let me know if you come across any bugs in benchmarker.py, or in the tutorials. If you have any questions that you would like to see addressed in the tutorials, please also let me know!&lt;br /&gt;&lt;br /&gt;If you want to cut straight to the action, you can install benchmarker.py with&lt;br /&gt;&lt;br /&gt;easy_install benchmarker.py&lt;br /&gt;&lt;br /&gt;(although I'd suggest doing this in a virtualenv for the time being). Please let me know if that doesn't work -- this whole exercise will be somewhat undercut if others have trouble installing the package!&lt;br /&gt;&lt;br /&gt;Thanks very much to those who have already helped identify bugs and issues, and contribute to lifting the standard of this package.&lt;br /&gt;&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7354787516009555231?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7354787516009555231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7354787516009555231' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7354787516009555231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7354787516009555231'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2011/07/debug-my-tutorials-and-try-something.html' title='Debug my tutorials (and try something new)'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-6476252581595885734</id><published>2011-05-08T15:18:00.000+10:00</published><updated>2011-05-08T15:18:56.893+10:00</updated><title type='text'>Help testing my new package-in-progress</title><content type='html'>Could some helpful Pythonista please try:&lt;br /&gt;&lt;br /&gt;easy_install benchmarker.py&lt;br /&gt;&lt;br /&gt;and let me know if it installs for you? If it installs, here's a simple script to use it and see if it works... this script is a pretty thin usage of the package but proves it works in a basic sense:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import bench&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from bench.benchmarker import benchmark&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; @benchmark()&lt;br /&gt;... def time_me():&lt;br /&gt;... &amp;nbsp; &amp;nbsp;for _ in range(100):&lt;br /&gt;... &amp;nbsp; &amp;nbsp; &amp;nbsp; pass&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; time_me()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; bench.benchmarker.print_stats()&lt;br /&gt;Sat May &amp;nbsp;7 22:06:06 2011 &amp;nbsp; &amp;nbsp;/tmp/tmp.pstats&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 300 function calls in 0.002 CPU seconds&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Random listing order was used&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ncalls &amp;nbsp;tottime &amp;nbsp;percall &amp;nbsp;cumtime &amp;nbsp;percall filename:lineno(function)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;100 &amp;nbsp; &amp;nbsp;0.000 &amp;nbsp; &amp;nbsp;0.000 &amp;nbsp; &amp;nbsp;0.000 &amp;nbsp; &amp;nbsp;0.000 {method 'disable' of '_lsprof.Profiler' objects}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;100 &amp;nbsp; &amp;nbsp;0.001 &amp;nbsp; &amp;nbsp;0.000 &amp;nbsp; &amp;nbsp;0.002 &amp;nbsp; &amp;nbsp;0.000 &lt;stdin&gt;:1(foo)&lt;/stdin&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;100 &amp;nbsp; &amp;nbsp;0.001 &amp;nbsp; &amp;nbsp;0.000 &amp;nbsp; &amp;nbsp;0.001 &amp;nbsp; &amp;nbsp;0.000 {range}&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Thanks!&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-6476252581595885734?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/6476252581595885734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=6476252581595885734' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6476252581595885734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6476252581595885734'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2011/05/help-testing-my-new-package-in-progress.html' title='Help testing my new package-in-progress'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7639423393280205844</id><published>2011-01-23T22:36:00.000+11:00</published><updated>2011-01-23T22:36:31.435+11:00</updated><title type='text'>python-twitter-tools wins!</title><content type='html'>(1) install python-twitter-tools&lt;br /&gt;(2) Register an app with twitter to get oath credentials&lt;br /&gt;(3) Run this code ftw!&lt;br /&gt;(4) You'll need to set those four variables to the ones you got in step 2 for this to work of course&lt;br /&gt;&lt;br /&gt;python-twitter-tools has the most natural twitter API I've seen. It's really beautiful. The namespace follows the restful API urls, so you don't need any documentation other than what's on the twitter dev website. It really does Just Work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import twitter&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;oa = twitter.oauth.OAuth(access_key, access_secret, consumer_key, consumer_secret)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;tw = twitter.Twitter(auth=oa)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;followers = tw.statuses.followers()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "You have", len(followers), "followers"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for f in followers:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print f['name']&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7639423393280205844?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7639423393280205844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7639423393280205844' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7639423393280205844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7639423393280205844'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2011/01/python-twitter-tools-wins.html' title='python-twitter-tools wins!'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-2871879840107383337</id><published>2011-01-22T21:38:00.000+11:00</published><updated>2011-01-22T21:38:09.700+11:00</updated><title type='text'>Three concentric spherical surfaces, with a randomly-connected graph overlaid on each one, spinning.</title><content type='html'>Three concentric spherical surfaces, with a randomly-connected graph overlaid on each one, spinning.&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=bXOTCZXkUjk"&gt;http://www.youtube.com/watch?v=bXOTCZXkUjk&lt;/a&gt;&amp;nbsp;... born of an idea I wanted to explore. Python + Mayavi = rapid gratification! Thought I'd post the code for anyone who's interested. I'm trialling the use of the Enthought Python Distribution, it certainly provides a nice technology stack to work with. All the components could be installed separately, but I'm very happy to have something where things "just work" (at least, so far).&lt;br /&gt;&lt;br /&gt;from enthought.mayavi import mlab&lt;br /&gt;from random import random&lt;br /&gt;from math import sin&lt;br /&gt;from math import cos&lt;br /&gt;import math&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;radius = 1&lt;br /&gt;azimuth = 0&lt;br /&gt;inclination = 0&lt;br /&gt;&lt;br /&gt;x, y = 0, 0&lt;br /&gt;&lt;br /&gt;RAD1 = 1&lt;br /&gt;RAD2 = 2&lt;br /&gt;RAD3 = 3&lt;br /&gt;&lt;br /&gt;def coord_from_rai((r, a, i)):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;x = round(r * sin(i) * cos(a), 4)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;y = round(r * sin(i) * sin(a), 4)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;z = round(r * cos(i), 4)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return ((x,y,z))&lt;br /&gt;&lt;br /&gt;def rai_from_coord((x, y, z)):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rad = math.sqrt((x**2 + y**2 + z**2))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;azimuth = math.atan(y/max(x,0.00000000000000001)) &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;inclination = math.acos(z/rad) &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return((rad, azimuth, inclination))&lt;br /&gt;&lt;br /&gt;def test_point_spherical_conversions():&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;points = [(1.,0.,0.),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(0., 1., 0.),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(0., 0., 1.),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(1., 1., 1.),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(0.3,0.5,0.9),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(2.6,2.2,2.3),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(2.,3.,4.),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(5.,7.,8.),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for point in points:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert coord_from_rai(rai_from_coord(point)) == point&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;except:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print "Original Point: ", point&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print "Rad, Az, Inc: ", rai_from_coord(point)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print "Converted Coord: ", coord_from_rai(rai_from_coord(point))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;raise&lt;br /&gt;&lt;br /&gt;def frange(start, stop, inc):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;stop = stop * 100&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for i in range(start, stop, inc * 100):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return float(i) / 100. &amp;nbsp; &lt;br /&gt;&lt;br /&gt;def points_for_line_arc(point1, point2, coords):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rad1, azimuth1, inclination1 = point1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rad2, azimuth2, inclination2 = point2&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;delta_rad = (rad2 - rad1) / 15.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;delta_az = (azimuth2 - azimuth1) / 15.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;delta_inc = (inclination2 - inclination1) / 15.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;line = []&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;line.append(point1)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for i in range(1, 15):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rad, az, inc) = line[-1] &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rai = (rad + delta_rad, az + delta_az, inc + delta_inc)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;line.append(rai)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if line[-1] != point2:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;line.append(point2)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return line&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def get_unique_random_point(radius, coords):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;azimuth = 2 * math.pi * random()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;inclination = 2 * math.pi * random()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return ((radius, azimuth, inclination))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;def plot_randomly_connected(radius, count, color=(1., 1., 1.)):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'''&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Plot &lt;count&gt; points on a sphere &lt;radius&gt; distance from the origin&lt;/radius&gt;&lt;/count&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Points will be connected by an arc line with 70% probability, with 5&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;subpoints on the arc line&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'''&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;coords = []&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for _ in range(0, count):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;coord = get_unique_random_point(radius, coords)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;coords.append(coord)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if len(coords) &amp;gt; 1 and random() &amp;gt; .001:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;line = coords[-2:]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;line = points_for_line_arc(line[0], line[1], coords)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cartesianLine = [coord_from_rai(point) for point in line]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(x, y, z) = zip(*cartesianLine)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mlab.plot3d(x, y, z, opacity=0.05, tube_radius=0.025, color=color)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cartesianPoints = [coord_from_rai(point) for point in coords]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(x, y, z) = zip(*cartesianPoints)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mlab.points3d(x, y, z, color=color, opacity=0.8/radius, scale_factor =1./(2*radius))&lt;br /&gt;&lt;br /&gt;plot_randomly_connected(1, 4, color=(.7,.2,.2))&lt;br /&gt;plot_randomly_connected(2, 16, color=(.2,.7,.2))&lt;br /&gt;plot_randomly_connected(3, 32, color=(.2,.2,.7))&lt;br /&gt;&lt;br /&gt;#test_point_spherical_conversions()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#mlab.show()&lt;br /&gt;from enthought.mayavi import mlab&lt;br /&gt;@mlab.animate&lt;br /&gt;def anim():&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;f = mlab.gcf()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;while 1:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;f.scene.camera.azimuth(4)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;f.scene.render()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield&lt;br /&gt;&lt;br /&gt;a = anim() # Starts the animation.&lt;br /&gt;mlab.show()&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-2871879840107383337?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/2871879840107383337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=2871879840107383337' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2871879840107383337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2871879840107383337'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2011/01/three-concentric-spherical-surfaces.html' title='Three concentric spherical surfaces, with a randomly-connected graph overlaid on each one, spinning.'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5609685157243160996</id><published>2010-12-10T16:14:00.000+11:00</published><updated>2010-12-10T16:14:56.754+11:00</updated><title type='text'>Service-based URL shorteners</title><content type='html'>&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;Generic URL-shortening services like goo.gl and bit.ly, should be made service-specific (image.ly, tube.ly) to avoid malware site redirects.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;It would work like this. Hypothetical image-based URL shortener image-bit.ly would check to make sure the site pointed to met any of the following qualifiers:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;&amp;nbsp;&amp;nbsp;-- Content of URL is a recognised image format. Require proper mime-type and image headers.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;&amp;nbsp;&amp;nbsp;-- Content of URL is a recognised image service provider, e.g. Facebook photo, Flickr photo etc&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;This would prevent people doing something like the following:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;"Hey check out this awesome photo of a rabbit SCUBA diving&amp;nbsp;http://bit.ly/roLeb"&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;which actually redirects you to something else entirely, like a shopping website, or worse something seedy, a malware site, or actual criminal content.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 14px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 18px;"&gt;A similar hypothetical tube-based URL shortener, pg-tube-bit.ly would do the same thing, but check the content was hosted on YouTube, or a variety of other family-friendly video hosting sites.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 18px;"&gt;That way, you still get URL shortened goodness, but also content safety.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 18px;"&gt;That's all!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 18px;"&gt;-Tennessee&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5609685157243160996?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5609685157243160996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5609685157243160996' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5609685157243160996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5609685157243160996'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/12/service-based-url-shorteners.html' title='Service-based URL shorteners'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5694618526384615180</id><published>2010-12-07T09:06:00.000+11:00</published><updated>2010-12-07T09:06:09.211+11:00</updated><title type='text'>Idea: Crowdcasting News</title><content type='html'>Okay, here's how I want to my get my news now. Think of it as like Digg meets the social graph.&lt;br /&gt;&lt;br /&gt;I have some kind of trust network of friends. A vanilla graph would do, but let's face it, I value news from some sources more than other. Anyone who stumbles on some news (or generates some) might tweet it at the moment, or Facebook it. I want them to amplify it instead.&lt;br /&gt;&lt;br /&gt;There is a database somewhere that tracks all the amplification clicks it gets against URLs, say keeping track of 2-3 days information. It then extracts those clicks which originated from my trust network, then weights all the URLs according to number of clicks. If a URL meets threshold, I get it as news. In fact, what I specify is my desired number of news items per day, and the threshold adapts.&lt;br /&gt;&lt;br /&gt;If I had that, I would completely replace newspapers. I would have an aggregated news feed and an aggregated comment feed (currently newspapers+slashdot+dig, and facebook+twitter+email).&lt;br /&gt;&lt;br /&gt;I think that would be cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5694618526384615180?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5694618526384615180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5694618526384615180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5694618526384615180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5694618526384615180'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/12/idea-crowdcasting-news.html' title='Idea: Crowdcasting News'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7804306977050156081</id><published>2010-11-19T12:59:00.000+11:00</published><updated>2010-11-19T12:59:20.474+11:00</updated><title type='text'>Daft ideas on social graphs</title><content type='html'>&lt;span class="Apple-style-span" style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13px;"&gt;Here's my issue with Facebook security. It's not information bleed to third parties, which I agree is important, but information bleed amongst social networks that I would like to keep separate. Work/Social being the primary division I would like to maintain. It's a lot *less* important to me if some marketing firm has my information than if my workmates know I faked sick leave or my friends are showered with geek updates. I would like multiple social graphs please. And I would like to give my blessing on a post or other Facebook object to a graph at a time, not a person at a time or an application at a time. I'm happy with connecting with applications and groups using "Like" or "Join", and I'm happy with friends-of-friends seeing most of my photos/updates. Within a single graph.&lt;br /&gt;&lt;br /&gt;I would like the following graphs:&amp;nbsp;&lt;br /&gt;&lt;br /&gt;The supergraph. Everyone in all of my graphs.&amp;nbsp;&lt;br /&gt;A professional subgraph. Workplace + geek.&amp;nbsp;&lt;br /&gt;A social subgraph: Friends and family.&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;- A family sub-subpgraph&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;- Logically, I may also need a friends sub-subgraph&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;- A dark subgraph: My connections are invisible to others in the graph&lt;br /&gt;&lt;br /&gt;Maybe I also want a public broadcast faux graph.&lt;br /&gt;&lt;br /&gt;That way, for example, my "Farmville Lame App" could suck down my social subgraph permissive fields, but be denied information on how much I earn. Why? Because it only gets fed what I feed my social graph.&amp;nbsp;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7804306977050156081?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7804306977050156081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7804306977050156081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7804306977050156081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7804306977050156081'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/11/daft-ideas-on-social-graphs.html' title='Daft ideas on social graphs'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-6330154827575556039</id><published>2010-07-29T10:38:00.000+10:00</published><updated>2010-07-29T10:38:01.626+10:00</updated><title type='text'>+1 for xmind... download and use it, it's awesome!</title><content type='html'>&lt;a href="http://www.xmind.net/"&gt;http://www.xmind.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've just downloaded this, and I've used it to create about 9 diagrams in two days. It's totally awesome. It can be used to create the following charts with no fuss at all, with nice icons if you would like to include that sort of thing:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-- Brainstorming map&lt;br /&gt;&amp;nbsp;&amp;nbsp;-- Organisation chart&lt;br /&gt;&amp;nbsp;&amp;nbsp;-- Spreadsheet-style chart&lt;br /&gt;&amp;nbsp;&amp;nbsp;-- Fishbone chart&lt;br /&gt;&lt;br /&gt;The concept map style chart really helped me to capture the major tasks, goals, responsibilities and relationships for me and my team, bringing together kinds of information that are otherwise quite difficult to relate to one another. It really helped me talk to them about how things tie together.&lt;br /&gt;&lt;br /&gt;I've also used the other chart styles to map out processes, systems and challenges, showing my boss and various colleagues how things hang together.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-6330154827575556039?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/6330154827575556039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=6330154827575556039' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6330154827575556039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6330154827575556039'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/07/1-for-xmind-download-and-use-it-its.html' title='+1 for xmind... download and use it, it&apos;s awesome!'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-3004676663124495401</id><published>2010-07-13T13:15:00.000+10:00</published><updated>2010-07-13T13:15:47.903+10:00</updated><title type='text'>Review of the Nexus One</title><content type='html'>Okay, so the Nexus One has just been released in Australia, and I am now a proud owner. This is my first foray into Phones 2.0, so I wasn't quite sure what to expect. I also have insanely high standards, and the quality of the computing platform comes into my evaluation.&lt;br /&gt;&lt;br /&gt;Review: Three and a Half Stars / Pretty good / Somewhat exceeds expectations&lt;br /&gt;&lt;br /&gt;Based on the iPhone4 articles I've read, antennae issues aside, the iPhone4 would rank at 4 stars. (out of 5 in both cases).&lt;br /&gt;&lt;br /&gt;The Nexus One has a good enough processor. It successfully gets over the bar of being an acceptable computing environment. I believe it's a 1Ghz chip, and I would say this is about the minimum you'd want before regarding a phone as a proper computing platform.&lt;br /&gt;&lt;br /&gt;The best thing about the Android is that it is open source. This means you can install stuff yourself, use the phone to do what you want, access any websites you and and basically freely use your own property. I've already used this to my own advantage and this was an overriding concern for me. That's where my perception of the iPhone lost a star.&lt;br /&gt;&lt;br /&gt;There are a few negatives I can report. The battery life is lousy. I'd expect this to be true of all the competitors, but it's just annoying to have to recharge twice a day (if you are using it somewhat actively). I don't think it's Google/HTC's fault as such, but it's an annoyance which I expect is present on every new gen phone.&lt;br /&gt;&lt;br /&gt;It doesn't have a front-facing camera, which means no video calls and no potential for cool face-recognition software. It could do with an extra camera.&lt;br /&gt;&lt;br /&gt;It doesn't do such a great job of flash. It will play YouTube (thank goodness) but if you stray to other sites with flash payloads, you'll be in trouble. I know "it's coming" but it's not there yet.&lt;br /&gt;&lt;br /&gt;The side buttons are a bit annoying. I accidentally push one of them every time I'm putting the phone back in its carry-case, usually the volume. The buttons at the bottom of the phone are also a bit random. There are four permanent buttons, plus a trackball. Unlike other users that I've read comments from, I don't find the trackball to be completely useless, because it lets you be more accurate about what you are selecting with the cursor. You wouldn't type with it, but it's not too bad for careful navigation or some games. That said, it does seem to be taking up some valuable real estate. There's a permanent "search" button which is basically pointless.&lt;br /&gt;&lt;br /&gt;The voice recognition is far from perfect, but it's also much quicker than typing. If they can figure it out, then it will be a great input mechanism. Don't talk for too long or it will stop listening and abandon the attempt.&lt;br /&gt;&lt;br /&gt;The keyboard is okay, and probably comparable to other phones. No comment really.&lt;br /&gt;&lt;br /&gt;I haven't gotten Python up and running yet. I failed on the first attempt, but haven't started to analyse the problem, so I expect it will be working soon.&lt;br /&gt;&lt;br /&gt;Anyway, that's my 2c!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-3004676663124495401?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/3004676663124495401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=3004676663124495401' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3004676663124495401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3004676663124495401'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/07/review-of-nexus-one.html' title='Review of the Nexus One'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7089550129996825029</id><published>2010-06-17T21:42:00.001+10:00</published><updated>2010-06-17T21:44:06.274+10:00</updated><title type='text'>'Python' vs 'python' @ python.org (Lexical Dispersion Plot)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_vku6UkK0lq8/TBoIGewIhiI/AAAAAAAAAAs/WVdS6vZujXc/s1600/pythoninpython.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="481" src="http://2.bp.blogspot.com/_vku6UkK0lq8/TBoIGewIhiI/AAAAAAAAAAs/WVdS6vZujXc/s640/pythoninpython.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Something I love about mucking about with language are the neat features that seem interesting, but it's hard to figure out what, if anything they mean. I downloaded 50m of html files from http://www.python.org, took the text out and then loaded it into the nltk library. I then did a lexical dispersion plot on two keywords, "Python" and "python". A lexical dispersion plot basically shows where in a text file a word occurs. If the files were organised by time, for example, the left part of this plot (near x=0) would be the oldest text, and the right part would be the newest text. My files weren't organised along any meaningful vector, so the offset only really shows how the data clusters internally. Ideally I'd order the text files by last-modified dates so that we could do a time analysis on the database.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Clearly, "Python" is used far more often than "python" within the site. However, round near offset=0, there's clearly a cluster of "python" uses. Maybe there's one rogue wiki editor who just likes using the lower case. Maybe it's used in links. Who knows? It's clear though, that the Python Software Foundation is very active in its pursuit of proper capitalisation of its trademark!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I'd have some more stuff to post, but I got sidetracked by fine-tuning my wget arguments to get a better dataset...&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;span id="goog_1478775288"&gt;&lt;/span&gt;&lt;span id="goog_1478775289"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7089550129996825029?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7089550129996825029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7089550129996825029' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7089550129996825029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7089550129996825029'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/06/python-vs-python-pythonorg-lexical.html' title='&apos;Python&apos; vs &apos;python&apos; @ python.org (Lexical Dispersion Plot)'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_vku6UkK0lq8/TBoIGewIhiI/AAAAAAAAAAs/WVdS6vZujXc/s72-c/pythoninpython.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-1542236001622445638</id><published>2010-06-16T22:35:00.000+10:00</published><updated>2010-06-16T22:35:50.804+10:00</updated><title type='text'>Basic web-to-language-stats processing done</title><content type='html'>Following process completed:&lt;br /&gt;  -- Use wget to capture a web corpus&lt;br /&gt;  -- Use BeautifulSoup to pull out the language bits (note, discovered nltk has some web scraping capabilities, need to compare)&lt;br /&gt;  -- Use nltk to read in plain text from web corpus&lt;br /&gt;  -- Print a few organisational language stats and plot a couple of neat graphs&lt;br /&gt;&lt;br /&gt;Need to develop:&lt;br /&gt;  -- Automated downloading through code rather than manual wget stage&lt;br /&gt;  -- Possibly add PDF scraping&lt;br /&gt;  -- Store files so they can go into the text database organised by creation date/time&lt;br /&gt;  -- Use nltk to be time-aware so that time charts can be plotted&lt;br /&gt;  -- Clean up the class design so it's (more) elegant and useful&lt;br /&gt;&lt;br /&gt;Need to document:&lt;br /&gt;  -- Technology stack involved&lt;br /&gt;&lt;br /&gt;Possible future developments:&lt;br /&gt;  -- Build web page out of the information found&lt;br /&gt;  -- Try out on a few different organisations&lt;br /&gt;  -- Add some metadata / parameters, build some more interesting info&lt;br /&gt;  -- Extent capacity to show information where organisation is cited in standard news websites&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-1542236001622445638?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/1542236001622445638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=1542236001622445638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1542236001622445638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1542236001622445638'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/06/basic-web-to-language-stats-processing.html' title='Basic web-to-language-stats processing done'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8456705535730982873</id><published>2010-06-15T23:32:00.000+10:00</published><updated>2010-06-15T23:32:18.166+10:00</updated><title type='text'>Organisational language analysis tools</title><content type='html'>Okay, so I'm just self-documenting some home hacking I'm doing at the moment to try to add some spice to my upcoming PyCon AU presentation. I thought I'd try to put together some code anyone could use to do some basic language analysis on their organisation. So far, I'm still building the language corpus which I'll be using. Tonight I've been using BeautifulSoup to parse web pages and extract the language components (defined for the time being as the string part of all the tags in a page).&lt;br /&gt;&lt;br /&gt;This should be more than enough to create a plain text language corpus that I can throw at nltk in order to get some scatter plots of word frequency, maybe most-common trigrams, most-common sentences etc. &lt;br /&gt;&lt;br /&gt;Step 1: Make a mirror of your organisation's website&lt;br /&gt;Tool: Wget&lt;br /&gt;Ease-of-use: Really easy&lt;br /&gt;&lt;br /&gt;Step Two: Scrape out the language parts&lt;br /&gt;Tool: Beautiful Soup (Python)&lt;br /&gt;Ease-of-use: Straightforward&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BeautifulSoup is currently pushing my laptop CPU up to 100% scraping 250m of web pages and seems to be doing a good job. I really love the description of the software on the home page:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;You didn't write that awful page. You're just trying to get some data out of it. Right now, you don't really care what HTML is supposed to look like.&lt;br /&gt;&lt;br /&gt;Neither does this parser.&lt;/blockquote&gt;&lt;br /&gt;For this kind of work, you really want something which is robust to minor quirks and hassles. The purpose is to get the most information for the least amount of work, and spending a lot of time polishing a data set is going to be wasted for most people's purposes.&lt;br /&gt;&lt;br /&gt;Anyway, enough for now...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8456705535730982873?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8456705535730982873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8456705535730982873' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8456705535730982873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8456705535730982873'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/06/organisational-language-analysis-tools.html' title='Organisational language analysis tools'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-4179400390632773208</id><published>2010-05-31T22:31:00.000+10:00</published><updated>2010-05-31T22:31:50.983+10:00</updated><title type='text'>Facebook group for PyCon AU 2010</title><content type='html'>&lt;a href="http://www.facebook.com/group.php?gid=100286146688061"&gt;PyCon AU Facebook Group&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For those who are keen on Facebook, I've created a group for PyCon AU 2010, to be held in Sydney on the 26th and 27th of June (with the organiser's blessing of course). I'll paste in any even updates, and it would be great to get a good number of people joined up in order to increase the visibility of the event.&lt;br /&gt;&lt;br /&gt;Yes, you too can be part of the message that PyCon AU is going to be absolutely fantastic. Please leave a comment on the wall and let us know what you're looking forward to.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-4179400390632773208?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/4179400390632773208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=4179400390632773208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4179400390632773208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4179400390632773208'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/05/facebook-group-for-pycon-au-2010.html' title='Facebook group for PyCon AU 2010'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-2190418947562943462</id><published>2010-03-30T20:28:00.000+11:00</published><updated>2010-03-30T20:28:43.015+11:00</updated><title type='text'>Creative Edge, Toronto: Article on Listening</title><content type='html'>Readme...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.soulmaking.com/listening.htm"&gt;Creative Edge, Toronto: Article on Listening&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;"My old pal Harry and I are walking in the park, improvising like two jazz musicians - except we're playing with words not melodies. He throws out a line. I have a comeback. He does a riff on my response. Pretty soon we're laughing so hard we're crying. Eventually we collapse, exhausted, on a park bench.&lt;br /&gt;&lt;br /&gt;"That was amazing, Harry," I say, "Why don't we do it more often?".&lt;br /&gt;&lt;br /&gt;I'm just being social, not really expecting a response, but Harry takes my question seriously. He leans closer, lowering his voice, like he's confiding in me."&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-2190418947562943462?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.soulmaking.com/listening.htm' title='Creative Edge, Toronto: Article on Listening'/><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/2190418947562943462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=2190418947562943462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2190418947562943462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2190418947562943462'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/03/creative-edge-toronto-article-on.html' title='Creative Edge, Toronto: Article on Listening'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-1199931503788450790</id><published>2010-03-18T00:45:00.000+11:00</published><updated>2010-03-18T00:45:13.254+11:00</updated><title type='text'>Incoherent Ramblings on Imagination, Semantic Nets, AI</title><content type='html'>I have been reading my AI textbook again, plus Daniel Dennett's frankly *brilliant* book "Darwin's Dangerous Idea" and I'm afraid it has sparked my overactive imagination!! If you read one serious book this year, make it that one.&lt;br /&gt;&lt;br /&gt;Suppose you tried to build an AI entity suchly...&lt;br /&gt;&lt;br /&gt;Suppose you start with a network of nodes. Each node is either an axiom node or a composite node. An axiom node is a node which represents something believed to be absolutely true, and un-decomposable at the current level of abstraction. A composite node is one which is not an axiom node. Composite nodes may be grounded (derived from only axiom nodes and other composite nodes) or un-grounded (only partially derived from axiom nodes and other composite nodes). The 'somethings' in the nodes may be facts as we know them (propositions about the objective world, say) or may be undescribed non-propositional nodes which are a part of learned relationships.&lt;br /&gt;&lt;br /&gt;One could "imagine" things by overlaying a supposition network over the knowledge network, perhaps using an inheritance structure (i.e. the imagined world derives from the real world but some subnetworks truth propositions are deemed to be different).&lt;br /&gt;&lt;br /&gt;Input streams and output streams are used to embody the agent. As such, the agent is constantly writing new observation nodes into its knowledge network.&lt;br /&gt;&lt;br /&gt;Over this knowledge network, rule processes run. These rule processes are also stored in the knowledge network, but are marked as rule processes. A simple rule process would be one which could enforce simple truth relationships. (i.e. If A --&gt; B and A is true, then make B true).&lt;br /&gt;&lt;br /&gt;Nodes would be scanned for identity (Node A is Node B if node A and node B are sufficiently indistinguishable with high confidence) representing network simplification. &lt;br /&gt;&lt;br /&gt;More complex rule processes could be "imagined" and run over the imagination network to evaluate their performance. In this way, imagination allows the entity to test potential rules for their truth value.&lt;br /&gt;&lt;br /&gt;The model scales to the extent that the network can be decomposed (i.e. the 'locality' factor of the network with respect to the problem at hand). For example, the application of simple rules which operate on say 3 nodes would be parallelisable and scale well, while complex rules which say operates on all nodes to a depth of N and branching factor of B would not parallelise as effectively.&lt;br /&gt;&lt;br /&gt;The fundamental mode of processing would be a build-and-test model of imagination where new knowledge networks are imagined then evaluated, and then incorporated if they perform better. This makes the system a memetic evolutionary system, which seems to me to be a prerequisite for sustainable machine learning.&lt;br /&gt;&lt;br /&gt;Learning success comes through untrained re-enforcement based on assessment of expectations of future observational input. Because the entity is based on input *streams* and output *streams*, then even non-action is a choice of the agent.&lt;br /&gt;&lt;br /&gt;All concepts, then, are either grounded concepts (fully understood and linked to base phenomena) or ungrounded concepts (not fully decomposable). I would also suggest that truth generally be a real-varying amount, but that Absolutely False and Absolutely True also be allowable values. &lt;br /&gt;&lt;br /&gt;This model supports "making assumptions" by building an imagination network where, for example, all things which are believed to be 98% true are taken to be absolutely true, then the results evaluated for performance. Experiments can be run in which nodes can be tested for unification, or a node could be split into two nodes then learning and assessment re-performed.&lt;br /&gt;&lt;br /&gt;Of course, I haven't even addressed any questions about the initial state of the system, how the learning algorithms actually work (how is knowledge propagated and how is re-enforcement applied), whether the AI needs multiple conceptual subnets, how current standard problem-solving techniques might be integrated etc etc. But that's okay, this is my blog and I'm just rambling.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-1199931503788450790?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/1199931503788450790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=1199931503788450790' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1199931503788450790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1199931503788450790'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2010/03/incoherent-ramblings-on-imagination.html' title='Incoherent Ramblings on Imagination, Semantic Nets, AI'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-867874217053884673</id><published>2009-11-13T17:08:00.000+11:00</published><updated>2009-11-13T17:08:35.963+11:00</updated><title type='text'>Resolver Spreadsheet = Awesome (ish)</title><content type='html'>Here are some reasons why Resolver Spreadsheet is awesome:&lt;br /&gt;&lt;br /&gt;  1. It produces Python code. There is no particular reason why I couldn't virtually cut-and-paste something from the spreadsheet as an algorithm in my application. Vice versa, there is no reason I couldn't "prove" an algorithm to a co-worker or supervisor by setting up some sample runs and graphing them.&lt;br /&gt;&lt;br /&gt;  2. It produces Python code. You can edit it to change the semantics. If you like coding, you can do it!&lt;br /&gt;&lt;br /&gt;Things that are not as awesome:&lt;br /&gt;  &lt;br /&gt;  1. It only runs on Windows&lt;br /&gt;&lt;br /&gt;  2. There's a 31 day evaluation. I understand why, but I still find evaluation periods annoying and too short. If I could have a 6-month evaluation period, then I'd be happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-867874217053884673?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/867874217053884673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=867874217053884673' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/867874217053884673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/867874217053884673'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/11/resolver-spreadsheet-awesome-ish.html' title='Resolver Spreadsheet = Awesome (ish)'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7074469071680360562</id><published>2009-09-24T20:26:00.003+10:00</published><updated>2009-09-24T20:30:30.447+10:00</updated><title type='text'>py3k fail</title><content type='html'>Okay, it's not py3k that's broken. It's just that I can't load jpgs (I think) because I can't use Pil to create a TkSomething graphics canvas (at least that's how it goes in the tutorial). Which means I can't try out what I wanted to try out using py3k. Hum. &lt;br /&gt;&lt;br /&gt;So I've reconfigured the project to Py26. It's a bit disappointing not to be able to use the latest version of my favourite language, but at least I can use the most exciting language features in Py26.&lt;br /&gt;&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7074469071680360562?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7074469071680360562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7074469071680360562' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7074469071680360562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7074469071680360562'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/09/py3k-fail.html' title='py3k fail'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-425368718660267689</id><published>2009-08-27T15:39:00.003+10:00</published><updated>2009-08-27T15:43:51.010+10:00</updated><title type='text'>Really Powerful AI: how close is YOUR system?</title><content type='html'>I read a lot about AI. Many people think AI is, one day, possibly soon, going to achieve a level of competency such that it will revolutionise the planet and destabilise humanity as the only intelligent force. Some people point to a number of identifiable trends in computing, usually trends in computing power, and claim this indicates a progression towards that stage.&lt;br /&gt;&lt;br /&gt;Some such people are crackpots, while others are insightful individuals with the knowledge and experience that they should know what they are talking about -- certainly well enough to give a valid and sensible opinion.&lt;br /&gt;&lt;br /&gt;However, I suspect that many people aren't directly working on a system which demonstrates such capability or promise.&lt;br /&gt;&lt;br /&gt;So here's my question to anyone working in AI (or any related area). How close is the system that you personally work on, right now, to demonstrating the kind of ability which would contribute significantly towards an independent, thinking machine? &lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-425368718660267689?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/425368718660267689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=425368718660267689' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/425368718660267689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/425368718660267689'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/08/really-powerful-ai-how-close-is-your.html' title='Really Powerful AI: how close is YOUR system?'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8150930042787606601</id><published>2009-08-21T10:10:00.002+10:00</published><updated>2009-08-21T11:14:42.533+10:00</updated><title type='text'>A few days of WingIDE; a few years of Eclipse</title><content type='html'>I thought I would just quickly blog about my experience giving Wing IDE a fair trial, using it exclusively to fix one particular bug in my system. The short version: it's okay. It needs a visual diff.&lt;br /&gt;&lt;br /&gt;Okay, so now for the long version. My application is a hybrid Python/C application, with my particular turf being almost exclusively in the Python code. The team has basically adopted Eclipse + PyDev as a kind of default environment, but it's not proscriptive. Eclipse works, there's no doubt about it. It supports pretty much the workflow I want, does a reasonable job of editing, and a reasonable job of communicating with our SVN repository. It's flexible, so I can do C work in it, hook into our ant targets, change the repository and manage multiple repositories. It's popular, so there is a wealth of information on teh internets. On the downside, I find that it's slow, the code folding is flaky (try folding a file, then editing just one method), prone to crashes.&lt;br /&gt;&lt;br /&gt;I've long known that Wing IDE exists, and for extra kudos it's written in Python. It seems to be a genuine competitor, and I thought I'd take it for a spin.&lt;br /&gt;&lt;br /&gt;The first thing I had to get used to was how it treats projects. It's probably better actually, but different. It creates project files, in which it stores (apparently) a list of files and directories which are included in the project, plus (presumably) various project settings and configuration files. However, it doesn't actually make your directories for you. You have to do that yourself, either during 'save as', or externally and add them to the project. Well, okay, I'll do that. But what's weird is that there's no capacity (that I could find) to create a project from a code repository. Checking the code out is legwork you have to do yourself, before you create the Wing IDE project. Well, okay...&lt;br /&gt;&lt;br /&gt;So I did that. Once the project is created, and the directory added, you can then enable version control for the project and then you finally get some GUI help with your repository. However, this is basically where Wing IDE starts to fall down, and unfortunately it's one of the things I ran into first. So, I'll hold off on criticizing this functionality while I talk about the good points.&lt;br /&gt;&lt;br /&gt;It's quick and responsive -- much nicer than Eclipse for doing the job of typing out code. Wing IDE is definitely a nicer editing experience.&lt;br /&gt;&lt;br /&gt;Its folding is mostly better. It doesn't randomly unfold while you're typing, which is a big win. Unfortunately (for my tastes) it folds all the methods directly next to eachother so there's no whitespace in between. I don't know if I like that, and I'm definitely not used to it. I prefer a gap so I can start typing in between two methods if I want to. But it's a big win over Eclipse.&lt;br /&gt;&lt;br /&gt;Its two-pane view is a little better, and again way faster. Eclipse throws a shoe sometimes when you have the same file open in two panes. It would be neat if I could flow one file into a kind of two-column layout with integrated scrolling, but Eclipse doesn't do that either.&lt;br /&gt;&lt;br /&gt;Its search is better and easier to use.&lt;br /&gt;&lt;br /&gt;In short, if it weren't for the code repository issues, to which I will now return, I'd much prefer Eclipse. So now for the show-stoppers.&lt;br /&gt;&lt;br /&gt;In Eclipse, as soon as I change a file, the project browser clearly marks that I have diverged from the latest repository version. Wing doesn't. &lt;br /&gt;&lt;br /&gt;In Eclipse, there is a *great* visual diff tool. Wing IDE will just show you the text diff file. &lt;br /&gt;&lt;br /&gt;Eclipse has a built-in repository browser. Wing doesn't.&lt;br /&gt;&lt;br /&gt;Anyway, I've run out of time to write down any more thoughts, but that was my experience trying out Wing. It needs to be more capable with code repositories before its functionally at the same level as Eclipse. When it gets there, its speed will put it in first place (for me).&lt;br /&gt;&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8150930042787606601?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8150930042787606601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8150930042787606601' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8150930042787606601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8150930042787606601'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/08/few-days-of-wingide-few-years-of.html' title='A few days of WingIDE; a few years of Eclipse'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8812935254784645957</id><published>2009-07-28T10:06:00.002+10:00</published><updated>2009-07-28T10:20:08.591+10:00</updated><title type='text'>I know I should know how to do this, but...</title><content type='html'>I'm convinced I have read about why not to do what I'm in the middle of doing. It even feels like a bad idea, but I'm having a brain failure. I'm refactoring. I have a bunch of methods which basically take a list of say 20 similar objects, and merge the similar objects together into new objects. Imagine having a list of 20 numbers. Any numbers within 1 of eachother are 'similar', and should be removed from the list, then their average should be added back to the list. After the process, you might end up with say 4 'representative' numbers.&lt;br /&gt;&lt;br /&gt;Okay, now I'm not dealing with numbers, but with complex objects, but the principle is the same. Rather than having like 6 different methods doing basically the same thing, I thought I would implement just *one* mergeList method which would take a pairwise mergeMethod which would then get applied to each pair. Okay, great. So I did that, but now I've realised that I'm going to end up with like 6 different pairwise mergeMethods, when really most of *those* are still pretty similar. In fact, some of them are already in my codebase and are written such that they take a modal switch as an argument.&lt;br /&gt;&lt;br /&gt;So now I'm in this situation where I have a generic merge process, but I need to pass modal arguments down to the pairwise merge method. Now for the evil bit.&lt;br /&gt;&lt;br /&gt;So, there's this thing called **kwargs. I can write my generic merge process such that it will accept arbitrary keyword arguments, which it can then pass directly to the pairwise merge methods. I could then call my generic method with a pairwise mergeMethod and additional arguments to be passed to that mergeMethod.&lt;br /&gt;&lt;br /&gt;Is that evil? Should I be using inheritance instead of modal arguments? &lt;br /&gt;&lt;br /&gt;Also, in self-defence, a lot of the constraints here come from dealing with a mature codebase. I'm just trying to work out where I should decide to draw the line and get things Done.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8812935254784645957?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8812935254784645957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8812935254784645957' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8812935254784645957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8812935254784645957'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/07/i-know-i-should-know-how-to-do-this-but.html' title='I know I should know how to do this, but...'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-4041722895326459762</id><published>2009-07-03T09:22:00.003+10:00</published><updated>2009-07-03T09:42:56.796+10:00</updated><title type='text'>HELP: How do you do Test Driven Design and Prototyping?</title><content type='html'>Here's where I fall over with TDD. Let's imagine a standard day in my life...&lt;br /&gt;&lt;br /&gt;I have some programming problem. I need to build a Thingy to do Stuff. I don't already have anything that does something similar, so I sit down and think about the problem. Along the way, I figure out some approaches to the problem. I don't really believe in BDUF, so mostly I'll just start coding. This kind of exploration is what helps me think, and so I'll build 2 or 3 partial programs before I start to converge on something approaching a solution. Let's dot-point the process so far:&lt;br /&gt;  &lt;br /&gt;  * Problem. Solution?&lt;br /&gt;  * Analyse&lt;br /&gt;  * Maybe scrawl out a flowchart&lt;br /&gt;  * Write a program that for some simple input, generates something like the right output&lt;br /&gt;  * Gather up more input data sets, and pump them through the program, extending and fixing as I go&lt;br /&gt;  * Reach workable solution&lt;br /&gt;&lt;br /&gt;Okay, now a few background points. This isn't how I'd approach a big, team project. But it's how I approach anything I have to solve by myself. I can't just navel-gaze and come up with a great program design, and if we're being honest, I'll bet you can't either. To reach a decent design, I basically need to build 2 or 3 mediocre attempts first. &lt;br /&gt;&lt;br /&gt;Now, as far as I understand it, TDD goes hand in hand with unit testing, which is all about small, well-tested, re-usable components. Well, that's great if your fundemental starting point as a designer / developer is the component. But really, it's not. Your starting point is the problem, and the process is one of decomposition and analysis. &lt;br /&gt;&lt;br /&gt;Some problems lend themselves to an easy decomposition. A problem which lends itself to a decomposition will immediately make you think "hey, I know how to solve this. If only I had a sorter, a comparison algorithm, some kind of message generator and an input parser this would be a cakewalk!". That kind of problem isn't so hard, and is made out of nice, well-defined objects whose role is well-understood. &lt;br /&gt;&lt;br /&gt;Other problems make you think "uh-oh. This one's going to take some coffee, a whiteboard and a fair bit of muttering." Some part of me thinks that the better and more experienced you get, the more new problems should tend to fall into the first category, but in fact I just tend to get given harder and harder problems (or so I think!)&lt;br /&gt;&lt;br /&gt;So this is a question to TDD experts. What is the design process that should be followed when confronted with a new problem?&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-4041722895326459762?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/4041722895326459762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=4041722895326459762' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4041722895326459762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4041722895326459762'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/07/help-how-do-you-do-test-driven-design.html' title='HELP: How do you do Test Driven Design and Prototyping?'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7732677750519819901</id><published>2009-06-30T15:29:00.003+10:00</published><updated>2009-06-30T15:33:32.257+10:00</updated><title type='text'>Call for interest: should I run a python AI competition?</title><content type='html'>This is just a shoutout to see whether there would be any interest in my running a Python AI competition? There are a few Pythoneers who are into AI that I know of, and it occurred to me that one thing which could be done to serve the community would be to offer a competition.&lt;br /&gt;&lt;br /&gt;At this stage, I'm thinking either of challenges which relate to basic AI algorithms, or perhaps building a chatbot/twitterbot. The first challenge should probably have a low barrier to entry, so perhaps I will put together a multi-stage or multi-challenge competition so that people can choose their own level of competition.&lt;br /&gt;&lt;br /&gt;Leave a comment with (+0) if you think it would be neat, (+1) if you would take part, (-0) if you're not really in favour, or (-1) if you would sabotage the competition :)&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7732677750519819901?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7732677750519819901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7732677750519819901' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7732677750519819901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7732677750519819901'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/06/call-for-interest-should-i-run-python.html' title='Call for interest: should I run a python AI competition?'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-2344965978663524752</id><published>2009-06-18T09:48:00.001+10:00</published><updated>2009-06-18T09:49:31.126+10:00</updated><title type='text'>Python, running in a browser</title><content type='html'>http://lackingrhoticity.blogspot.com/2009/06/python-standard-library-in-native.html&lt;br /&gt;&lt;br /&gt;I have a dream: one day, I will be able to not know Javascript. Thanks Mark!&lt;br /&gt;&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-2344965978663524752?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/2344965978663524752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=2344965978663524752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2344965978663524752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2344965978663524752'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/06/python-running-in-browser.html' title='Python, running in a browser'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-6409486478588456933</id><published>2009-06-17T13:37:00.002+10:00</published><updated>2009-06-17T15:10:51.642+10:00</updated><title type='text'>Driving unit test takeup with code coverage</title><content type='html'>For anyone who has not fully gotten organised with unit testing and code coverage, this is for you! :) My project involved a large inherited codebase which has good black-box testing, but little unit testing and no coverage metrics. Tackling unit testing was always something impossible for me -- how do you take 96, 000 lines of Python and 1, 000, 000 lines of C, and build unit tests? (nb the lines-of-C count seems high, but it's what 'wc' said.)&lt;br /&gt;&lt;br /&gt;The general advice is not to try -- but to get traction by just writing one unit test for the next bit of new code you write. Then, the next bit, etc. Eventually, you will have figured out unit testing and will then make an appropriate judgment on what to do about the body on untested code.&lt;br /&gt;&lt;br /&gt;I have typically found this to be quite a large hill to climb. I work only on a subset of the code, which practically requires me to invoke most of the code just to get to my part. Most of my methods require such a lot of setup that it seemed quite infeasible to tackle unit testing without doing some more thinking about how to do this in a sane way. Setting up and tearing down my application was just not going to be feasible if I were going to put a lot of unit tests in place -- I reckon the setup would have cost between 1 and 7 minutes per test!&lt;br /&gt;&lt;br /&gt;This got relegated to the too-hard basket, and set aside until now. Here's how I found a way to get traction.&lt;br /&gt;&lt;br /&gt;What turns out to be pretty straightforward, is integrating coverage testing. You more-or-less just switch it on, and it will record to a file across multiple program invocations. This can be used to count coverage across test scripts, or user testing, or development mode use, or indeed in operations. &lt;br /&gt;&lt;br /&gt;I ran this through about half my black-box tests, and found I was sitting at around 62% code coverage. That's not too shabby, I reckon! I know for a fact that there are quite large chunks of code which contain functionality which is not a part of any operational code path, but is preserved for possible future needs. I estimate 25% of our code would fall into that category, lifting the coverage to 87% for the sub-area of code which I work on. Now I've got numbers that look like a challenge, rather than an insoluble problem!&lt;br /&gt;&lt;br /&gt;I think that's the key... make lifting code metrics an achievable challenge, then it will seem more attractive. It's probably important not to target a particular number. I know '100% or bust' may be what some advocates would put forward, but for anyone new to the concept, I personally feel that simply measuring the current coverage, then understanding where that number comes from and what it means, it the more important achievement.&lt;br /&gt;&lt;br /&gt;What is clear is that I'm not going to easily lift my coverage metrics beyond a certain point simply through tactical black-box testing. I'm going to have to write tests which go through the code paths which aren't part of the operational configuration. I'm going to have to write tests with very specific setup conditions in order to get to lines of code which are designed to handle very specific conditions. All of a sudden, I've got achievable and well-defined goals for unit testing.&lt;br /&gt;&lt;br /&gt;I call that a win!&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-6409486478588456933?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/6409486478588456933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=6409486478588456933' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6409486478588456933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6409486478588456933'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/06/driving-unit-test-takeup-with-code.html' title='Driving unit test takeup with code coverage'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-257100463255491434</id><published>2009-06-17T12:58:00.001+10:00</published><updated>2009-06-17T12:59:14.237+10:00</updated><title type='text'>Anyone been to an Australasian Joint Conference on Artificial Intelligence</title><content type='html'>Dear lazyweb,&lt;br /&gt;&lt;br /&gt;Has anyone been to one of these conferences in the past? Did you find it valuable as an attendee? Please feel free to email me directly at tleeuwenburg@gmail.com if you would prefer not to leave your comments publicly.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-257100463255491434?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/257100463255491434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=257100463255491434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/257100463255491434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/257100463255491434'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/06/anyone-been-to-australasian-joint.html' title='Anyone been to an Australasian Joint Conference on Artificial Intelligence'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-3103040306177270182</id><published>2009-06-11T14:36:00.003+10:00</published><updated>2009-06-11T15:12:38.745+10:00</updated><title type='text'>The Pinball Principle</title><content type='html'>I read a fair bit about different development methods. Agile is pretty popular amongst developer advocates, but I would argue almost everyone in charge of development *actually* just runs with a grab-bag of "what works for them" taken from Waterfall, Agile, what their peers think, what happened on the last project etc. They'd be mad not to -- can you imagine running development based on what doesn't work for you?&lt;br /&gt;&lt;br /&gt;Some people talk about bottom-up vs top-down, inversion of control, directed vs undirected, the importance of use cases, test-driven development etc. Usually, the argument is that if you tick whatever list is being advocated, better software will get written in an efficient amount of time and deliver what was ordered to the greatest extent. But, somehow, it never seems to work out that way.&lt;br /&gt;&lt;br /&gt;There is a huge complicating factor, which is that most development activity is done due to an obligation owed by an employee to an employer, client or other stakeholder. The developer ends up responsible for not just managing their own development practises, but managing their clients through the process also. If there are just a few stakeholders, then that's easier (unless they're very difficult stakeholders). Issues come up when there are multiple stakeholders, and when there is conflict between those stakeholders. The best possible course of action ceases to be "build and deliver approximately X" and becomes "make all these people happy to the extent possible".&lt;br /&gt;&lt;br /&gt;How does making people happy fit in with SLDC practises? Where do you stand firm, and where are you flexible? When do you tell your manager "we shouldn't do that" and when do you just fit in? How do you sell a use-case Agile practise to a control-oriented manager? What are the ethics of accepting your manager's control-oriented activities if you think things could be done better another way? When do you take a decision on your own shoulders? How do you actually adopt new design practises? How does it fit into the development team and the organisational culture?&lt;br /&gt;&lt;br /&gt;Most people in an organisation run according to what I call the 'pinball principle', which is to say they get batted around by their key stakeholders, bouncing off obstacles, temporary victories, other groups etc like the objects in a pinball game. To some extent you can control your own fate and direction, but there are a *lot* of things which you can't control.&lt;br /&gt;&lt;br /&gt;In a large development team, a kind of 'surface' will form around the team, representing that team's culture, which can protect those inside of it. However, some people either don't have a protective surface, or they are right on the edge of it. In these cases, you can't simply adopt a practise and hope it will result in better outcomes, you need to use personal insight to negotiate the situation you find yourself in, and no amount of 'best practise' will prevent your key stakeholders looking you in the eye and demanding action, their way.&lt;br /&gt;&lt;br /&gt;The question is whether there is anything we can learn from the pinball principle. If our environment is so complex and demanding, is there anything about that which should inform our behaviour? Should we acquiesce to all incoming requests, devolving responsibility, and concentrating instead on doing the best job we can? Or will something like the Agile methodology allow us to write great componentry which will then turn out to be just the thing for the next request? Should we attempt to educate stakeholders in appropriate negotiation processes, or should we instead rely on meetings and face2faces to take care of things. What is the cost of attempting to enforce process?&lt;br /&gt;&lt;br /&gt;If project direction is likely to be set by pinball mechanics, how can we best write software knowing that will happen?&lt;br /&gt;&lt;br /&gt;I don't know the answers -- not all of them anyway. But here is *my* list of things which I think will help keep the development *direction* on-track, and best serve long-term development success. I have just come up with them now, but they are based on ideas which I have been refining for some time now. I'd love feedback on the list and this post!&lt;br /&gt;&lt;br /&gt; 1. Get all of the stakeholders into the same room at least once a month. Make them review their priorities in front of everyone else, and get agreement on the priorities for the development team.&lt;br /&gt; 2. Maintain a whiteboard or wiki with the top four development priorities. Focus prioritisation on the top four issues. &lt;br /&gt; 3. Email out a bulletin every fortnight without fail to all stakeholders and users who are interested, including the current priority list and progress achieved.&lt;br /&gt; 4. Hold 'air your grievances' sessions regularly (say twice a year), especially if there is a layer of bureaucracy between you and your end users. Don't minute them.&lt;br /&gt; 5. Identify what makes your stakeholders actually happy (i.e. less user complaint, positive feedback from other departments etc) rather what what they say they want (more progress for less money). You will only make other people happy by reducing the pressure they get from the pinball board. That's only sometimes the same as what they're asking you to do&lt;br /&gt; 6. Pursue a two-layer development methodology. Make the bottom layer whatever you like (Agile, TDD, Waterfall), and make sure the developers understand it. Keep on top of new ideas here. Make the top layer As Simple As Humanly Possible. This is your 'interface' process, and keeping it simple is the only way that others will follow it. If you can't explain it at the beginning of every meeting in two slides, then it's too complicated.&lt;br /&gt; 7. Document Everything. &lt;br /&gt; 8. Publishing = profile = perception. Make sure you nail the following items: project web page, prototype web page, email bulletins, conference/journal publications (if relevant), regular meetings/presentations&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-3103040306177270182?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/3103040306177270182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=3103040306177270182' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3103040306177270182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3103040306177270182'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/06/pinball-principle.html' title='The Pinball Principle'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7860531559578765725</id><published>2009-05-29T11:09:00.002+10:00</published><updated>2009-05-29T11:19:50.663+10:00</updated><title type='text'>Multi-party vidoeconferencing</title><content type='html'>Is it practical yet to have a multi-party videoconferences? What free software should I use? What will work for both Windows and Linux?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7860531559578765725?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7860531559578765725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7860531559578765725' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7860531559578765725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7860531559578765725'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/05/multi-party-vidoeconferencing.html' title='Multi-party vidoeconferencing'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-6849840655670172155</id><published>2009-05-19T09:45:00.002+10:00</published><updated>2009-05-19T09:57:54.937+10:00</updated><title type='text'>Cobra -- Next Big Thing (in a few years time)</title><content type='html'>Thanks to Simon Wittber for alerting me to this language via his blog post, "&lt;a href="http://entitycrisis.blogspot.com/2009/05/cobra-vs-python.html"&gt;Cobra vs Python&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cobra-language.com/"&gt;The Cobra homepage is available here.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cobra-language.com/docs/python/"&gt;The Cobra v Python overview is available here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm going to make the ludicrously early call that this language will be the next big thing, eventually. I will not be moving away from Python any time soon, since (a) my job depends on it, and (b) it's fully operational now. However, I really do think that Cobra is, if not simply 'better', an important step forward in the evolution of dynamic language generally. Watching Cobra develop will provide insights for all languages, I have no doubt!&lt;br /&gt;&lt;br /&gt;It has the features that make Python great, plus important features from other languages which will make it even more popular and even more palatable. It allows the kind of productivity you can only get from being able to 'throw something together' using elegant syntax and high-level semantics with dynamic typing, but then it *also* allows optional static typing to get the most out of compile-time checking to provide early-warning of type errors and an extra layer of guarantee of program functionality. It also includes contracts, which, while they could in general terms be implemented in any language using a lot of assert statements, are supported by Cobra with a neat syntax which will encourage their use. I can well imagine using this as a strong argument in its favour -- developers could prototype a system or server using dynamic typing, then go back and tighten up the screws with static typing as appropriate and the introduction of contracts.&lt;br /&gt;&lt;br /&gt;It deploys to all major platforms, including .NET. &lt;br /&gt;&lt;br /&gt;For me personally, the best features are:&lt;br /&gt;  * Decimal arithmetic by default (i.e. the literal 5 will become a decimal, not a float)&lt;br /&gt;  * Optional static typing&lt;br /&gt;  * Contracts&lt;br /&gt;  * That all the best features (for me) of Python are included&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-6849840655670172155?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/6849840655670172155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=6849840655670172155' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6849840655670172155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6849840655670172155'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/05/cobra-next-big-thing-in-few-years-time.html' title='Cobra -- Next Big Thing (in a few years time)'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-677188986458315200</id><published>2009-05-14T11:45:00.001+10:00</published><updated>2009-05-14T11:46:15.618+10:00</updated><title type='text'>Two big thumbs up for OpenGoo</title><content type='html'>http://www.opengoo.org/&lt;br /&gt;&lt;br /&gt;It's like Google Docs on steroids, but open-source and installable on your intranet right now.&lt;br /&gt;&lt;br /&gt;I've only spent about 3 minutes exploring this software, but it appears to be absolutely amazing.&lt;br /&gt;&lt;br /&gt;Two thumbs up, OpenGoo!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-677188986458315200?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/677188986458315200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=677188986458315200' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/677188986458315200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/677188986458315200'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/05/two-big-thumbs-up-for-opengoo.html' title='Two big thumbs up for OpenGoo'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8636204845841472779</id><published>2009-04-27T13:50:00.002+10:00</published><updated>2009-04-27T14:26:01.977+10:00</updated><title type='text'>Pro bono activities</title><content type='html'>Do any IT firms have explicit pro bono programs or open-source contribution programs which might mirror the pro bono activities of legal firms? The law industry obviously has a long-standing culture of engaging in pro-bono activities with the imprimatur of the corporation.&lt;br /&gt;&lt;br /&gt;A few IT companies obviously house and/or champion open-source projects. However I'm not sure how these are really structured. Does 'the system' adequetly encourage and/or support these activities (beyond simple competitive-self interest, or enlighted corporate social responsibility)? Are there tax breaks for companies engaging in open-source or pro-bono activities such as ethical or charitable software development?&lt;br /&gt;&lt;br /&gt;I just don't know. Perhaps the answer is very well-known, but I didn't turn up much in 20 minutes of looking. I just felt like blogging my curiosity on the topic...&lt;br /&gt;&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8636204845841472779?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8636204845841472779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8636204845841472779' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8636204845841472779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8636204845841472779'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/04/pro-bono-activities.html' title='Pro bono activities'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-9147585428935315540</id><published>2009-04-09T12:26:00.003+10:00</published><updated>2009-04-09T13:08:16.528+10:00</updated><title type='text'>Ramblings on AI</title><content type='html'>As some know, I work on a natural language generation system for weather forecast reporting. I also have an interest in general AI. This post represents little more than the idle thinkings from my lunch break...&lt;br /&gt;&lt;br /&gt;The ultimate question of AI is, of course, can we build a machine that thinks (for various definitions of thinks)? One response to that question by anyone interested in programming is to imagine how such a thing might be constructed. &lt;br /&gt;&lt;br /&gt;I have presented on the topic of the structure of an AI agent before. I have been trying to flesh out some aspects of what many might call the most fundamental component, the reasoning and learning engine. As I write that, however, it is of course possible that these be two separate systems, but I will continue as though they were one. By learning here, I don't just mean laying down and accessing memories, but rather the act of mapping a new situation onto an existing conceptual framework, either by creating new conceptual substructures or recognising the applicability of an existing conceptual substructure.&lt;br /&gt;&lt;br /&gt;Along the way, a number of people have offered their insights as to what may be the best way to perform reasoning and learning, but I'm not convinced they have solved the issue of conceptual structure yet.&lt;br /&gt;&lt;br /&gt;I have come to think that any AI system will need, in addition to generalised learning tools, a number of pre-written or pre-constructed concepts and processes for understanding information. An example of a conceptual construct may be a Bayesian Network. The agent might go -- oh hey look, here's a situation with a bunch of discrete inputs which I can recognise, and a few output states! Great, I can map this new situation onto a Bayesian Net and learn some appropriate responses.&lt;br /&gt;&lt;br /&gt;Going further, the system may be able to recognise a new situation as being related to a known situation. Oh great -- this situation is really a variation on the Poker Card Game! I'll copy that network and get a head start on my learning. I'll just set these probabilities to .5 since they're unknowns and away I go.&lt;br /&gt;&lt;br /&gt;However, what's not clear to me is how an agent could possibly going about choosing the appropriate input schema, come up with its own output states, or infer network structure. This problem extends to many kinds of reasoning engine -- rule-based systems, ANN, others.&lt;br /&gt;&lt;br /&gt;Clearly, there is no One True Network to rule them all. I don't know whether anyone can conceive of a any structure which is inherently able to perform all thinking. The human brain doesn't appear to be built that way either. To my understanding, it is born with some inherent structures plus the ability to learn. It demonstrated remarkable plasticity and regenerative capacity, but it's still the case that there are certain physical areas which strongly tend to be responsible for particular kinds of thinking.&lt;br /&gt;&lt;br /&gt;It is also probably true that no-one is every going to have the kind of direct insight and 'just come up with' a fully generalisable reasoning engine capable of learning how to deal with any situation.&lt;br /&gt;&lt;br /&gt;However, it does seem to me to be possible to proceed along the following path:&lt;br /&gt;  * Identify some situations&lt;br /&gt;  * Write conceptual structures which can reason about those situations&lt;br /&gt;  * Write additional software which attempts to map new situations onto existing situations&lt;br /&gt;  * Write software which is capable of evolving new conceptual structures to some extent&lt;br /&gt;&lt;br /&gt;It seems as though learning new things needs a structure to cling to -- like evolution. It's very difficult to cross certain functional divides solely through a process of evolution. Unlike organisms, who live, reproduce and die, conceptual structures can do more than that. We can use our insight as humans to build more advanced structures more quickly than may arise through chance. If we see the mind itself as consisting of a low-level, always-on, processing algorithm in which a multitude of conceptual structures exist, I think that could help. We should be able to give any AI a head-start by building some specific conceptual structures while still allowing others to evolve and grow.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;well, I'll think more about that later.&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-9147585428935315540?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/9147585428935315540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=9147585428935315540' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9147585428935315540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9147585428935315540'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/04/ramblings-on-ai.html' title='Ramblings on AI'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8396837300409907013</id><published>2009-04-03T16:25:00.002+11:00</published><updated>2009-04-03T16:28:14.078+11:00</updated><title type='text'>Call a function recursively</title><content type='html'>At the risk of public embarassment, I didn't actually know I could do this:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; def recursive(list):&lt;br /&gt;...   if len(list) == 1:&lt;br /&gt;...     print list[0]&lt;br /&gt;...   else:&lt;br /&gt;...     recursive([list[0]])&lt;br /&gt;...     recursive(list[1:])&lt;br /&gt;...&lt;br /&gt;&gt;&gt;&gt; recursive('hello')&lt;br /&gt;h&lt;br /&gt;e&lt;br /&gt;l&lt;br /&gt;l&lt;br /&gt;o&lt;br /&gt;&lt;br /&gt;It seems perfectly obvious now -- it's not like I've never written code like this in other languages, but for some reason I just hadn't been thinking about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8396837300409907013?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8396837300409907013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8396837300409907013' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8396837300409907013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8396837300409907013'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/04/call-function-recursively.html' title='Call a function recursively'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-2455748050353928667</id><published>2009-04-02T09:27:00.001+11:00</published><updated>2009-04-02T09:28:49.985+11:00</updated><title type='text'>Open Science: Good for Research, Good for Researchers</title><content type='html'>&lt;a href="http://scholcomm.columbia.edu/open-science-good-research-good-researchers"&gt;http://scholcomm.columbia.edu/open-science-good-research-good-researchers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Quote: '''&lt;br /&gt;Open science refers to information-sharing among researchers and encompasses a number of initiatives to remove access barriers to data and published papers, and to use digital technology to more efficiently disseminate research results. Advocates for this approach argue that openly sharing information among researchers is fundamental to good science, speeds the progress of research, and increases recognition of researchers. Panelists: Jean-Claude Bradley, Associate Professor of Chemistry and Coordinator of E-Learning for the School of Arts and Sciences at Drexel University; Barry Canton, founder of Gingko BioWorks and the OpenWetWare wiki, an online community of life science researchers committed to open science that has over 5,300 users; Bora Zivkovic, Online Discussion Expert for the Public Library of Science&lt;br /&gt;'''&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-2455748050353928667?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/2455748050353928667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=2455748050353928667' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2455748050353928667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2455748050353928667'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/04/open-science-good-for-research-good-for.html' title='Open Science: Good for Research, Good for Researchers'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7029828730641747848</id><published>2009-03-27T16:22:00.002+11:00</published><updated>2009-03-27T16:29:12.546+11:00</updated><title type='text'>Call for Reviewers to The Python Papers</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;This is a call for assistance from the Python community to register as a potential reviewer for The Python Papers. We are currently unable to process our academic articles as effectively as we would like due to a small list of reviewers. It would be wonderful to have some more people register with ojs.pythonpapers.org and flag their availability as reviewers for our academic stream. You can flag this in the "reviewing interests" section of your profile.&lt;br /&gt;&lt;br /&gt;Reviewing a paper need not be intimidating or difficult, and is a great opportunity to contribute back towards the community in the form of supporting academic work which involves Python.&lt;br /&gt;&lt;br /&gt;For those who do not feel they have an academic bent, we also make use of our list of registered users when exploring articles in the technical stream.&lt;br /&gt;&lt;br /&gt;Thanks very much,&lt;br /&gt;-Tennessee Leeuwenburg&lt;br /&gt;(Co-Chief Editor, The Python Papers)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7029828730641747848?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7029828730641747848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7029828730641747848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7029828730641747848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7029828730641747848'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/03/call-for-reviewers-to-python-papers.html' title='Call for Reviewers to The Python Papers'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-9180651672731404103</id><published>2009-03-13T19:38:00.003+11:00</published><updated>2009-03-13T20:34:37.256+11:00</updated><title type='text'>Wheelchair tech</title><content type='html'>I was walking about my city recently, and observed a woman in a wheelchair using some form of touch-screen interface, on a screen which was integrated to the chair. Further to the mobility difficulties, she appeared to suffer from a more generalised difficulty with effective use of her limbs. I do not know what she was doing; nor what the functionality of the interface was. Here is what I think *should* have been on it. What do you think?&lt;br /&gt;&lt;br /&gt;1.) Integrated GPS system displaying directions overlaid on a map&lt;br /&gt;2.) A large-buttoned interface tied into a telephone dialing system, allowing ease-of-access to Taxi services, personal contacts and any relevant emergency services that may be required&lt;br /&gt;3.) If necessary for safety, a GPS tracking device. For some individuals with a carer who is partially responsible for their wellbeing, the capacity for that carer to easily contact and locate the impaired individual could substantially increase freedom of travel&lt;br /&gt;4.) Additional geographic information systems covering accessibility of local public transport; accessible footpaths and eating establishments; accessible public toilets and other facilities&lt;br /&gt;&lt;br /&gt;Any other suggestions for this somewhat naive list?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-9180651672731404103?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/9180651672731404103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=9180651672731404103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9180651672731404103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9180651672731404103'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/03/wheelchair-tech.html' title='Wheelchair tech'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-4417857487003071495</id><published>2009-01-02T13:39:00.002+11:00</published><updated>2009-01-02T13:50:17.458+11:00</updated><title type='text'>Watermarks, signatures and security</title><content type='html'>I just had this idea... I was thinking about computerising organisaitonal processes which require an approval signature. Suppose manager X needs to approve request R. If he has a drawing tablet, he could digitally sign a document -- that is to say associate it with the document either by overlaying it or attaching it. However, that's somewhat susceptible to hacking by taking an image of a signature and associating it with some other document. That is to say, it's hard to guarantee that the associated signature is 100% confirmed on the document being signed.&lt;br /&gt;&lt;br /&gt;Supposing, instead, that I had software which did this:&lt;br /&gt;  1.) Take signature input from drawing pad&lt;br /&gt;  2.) Generate a hash from the signature image&lt;br /&gt;  3.) Use the hash as a salt for a watermark &lt;br /&gt;  4.) Create a watermarked document&lt;br /&gt;  5.) Overlay the signature image onto the watermarked document image&lt;br /&gt;  6.) Lodge the image hash in some collision detection database&lt;br /&gt;&lt;br /&gt;It seems to me like I should be able to encode the signature hash into the watermark document somehow. Then, it seems like I should be able to guarantee that the watermarked document was created using the signature that's on the document.&lt;br /&gt;&lt;br /&gt;A forger/hacker could not then take the signature and do the same thing to another document, because the duplicate hash would then get picked up by the collision detection database. Further, each colliding document could be identified by its watermark and signature hash. All anyone using the system need to is check that the document is watermarked. The system guarantees that all watermarked documents are properly authorised.&lt;br /&gt;&lt;br /&gt;Should a *real* hash collision occur, the authorising supervisor could just re-sign the document.&lt;br /&gt;&lt;br /&gt;This relies on every signature being subtly different. That is, the tablet must have quite high resolution to capture the slight differences of pen pressure and letter shape in each signature. This doesn't seem beyond the realms of possibility however.&lt;br /&gt;&lt;br /&gt;And, once all it said and done, there exists a system where:&lt;br /&gt;  * The approving manager can just sign digital documents completely straightforwardly&lt;br /&gt;  * All authorised documents are stored and tracked&lt;br /&gt;  * All digitally watermarked documents have a full history&lt;br /&gt;&lt;br /&gt;What does the blogosphere think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-4417857487003071495?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/4417857487003071495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=4417857487003071495' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4417857487003071495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4417857487003071495'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2009/01/watermarks-signatures-and-security.html' title='Watermarks, signatures and security'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5493717153003700048</id><published>2008-12-15T09:52:00.002+11:00</published><updated>2008-12-17T09:33:33.665+11:00</updated><title type='text'>bluehackers.org</title><content type='html'>"It started with Arjen doing the last lightning talk at OSDC 2008… a&lt;br /&gt;quick show of hands on who else had dealt with (or was dealing with)&lt;br /&gt;depression. Everybody had a look around, and thus knew that they&lt;br /&gt;weren’t alone. Afterwards, there was more positive feedback which&lt;br /&gt;continued over email in the days that followed. Someone suggested&lt;br /&gt;starting a group, and the same day &lt;a href="http://bluehackers.org"&gt;bluehackers.org&lt;/a&gt; was born.&lt;br /&gt;&lt;br /&gt;The objective of this initiative is to make visible that there are&lt;br /&gt;many fellow geeks among us who are intimately familiar with&lt;br /&gt;depression, anxiety, or bipolar disorder. It helps to know you’re not&lt;br /&gt;alone. And it’s not because we’re geeks, but because we’re human. The&lt;br /&gt;Australian BeyondBlue site is of course an excellent resource, but,&lt;br /&gt;because geeks have a specific work environment, there are also&lt;br /&gt;particular challenges in dealing with these issues, and that’s where&lt;br /&gt;we feel our group can help with additional insights, tips, and posts&lt;br /&gt;from others with experience.&lt;br /&gt;&lt;br /&gt;Using the logo, we can also make the topic visible at meetings and&lt;br /&gt;conferences around the world, ensuring that indeed no geek need feel&lt;br /&gt;alone in this, or feel unsupported. They can simply look around and&lt;br /&gt;see. Anybody will be able to show their support and understanding, in&lt;br /&gt;a kind and non-intrusive manner."&lt;br /&gt;&lt;br /&gt;...a repeated message from Arjen Lentz&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5493717153003700048?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5493717153003700048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5493717153003700048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5493717153003700048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5493717153003700048'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/bluehackersorg.html' title='bluehackers.org'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-6003351527994124320</id><published>2008-12-05T16:14:00.002+11:00</published><updated>2008-12-05T16:49:15.579+11:00</updated><title type='text'>OSDC liveblogging: OLPC in Australia</title><content type='html'>Presentation by Pia Waugh, OLPC &lt;br /&gt;pia@olpcfriends.org&lt;br /&gt;&lt;br /&gt;To clarify: &lt;br /&gt; - project is not the KR thing&lt;br /&gt; - not paid by OLPC, voluntary talk&lt;br /&gt;&lt;br /&gt;Great FOSS project&lt;br /&gt;Opportunity to create a regional approach&lt;br /&gt; - connected classroom&lt;br /&gt; - shared resources&lt;br /&gt; - supplementing poorer countries&lt;br /&gt; - do have great need in our regions, despite relative advantage overall&lt;br /&gt; - create community of educators etc&lt;br /&gt;&lt;br /&gt;Imagine if many people's education were based on an open source platform&lt;br /&gt;&lt;br /&gt;Child takes a sense of ownership / responsibility for OLPC device&lt;br /&gt;Better for each to have their own rather than to share for this reason&lt;br /&gt;Target group is 6-12 years old&lt;br /&gt;&lt;br /&gt;Important tenet is connectivity&lt;br /&gt; - Can visualise mesh network of who is nearby&lt;br /&gt; - FOSS, building blocks, building blocks for creativity&lt;br /&gt;&lt;br /&gt;Some of the technology&lt;br /&gt;----------------------&lt;br /&gt;&lt;br /&gt;Antennae takes 5V in, can be used independently for mesh range estension&lt;br /&gt;School server version&lt;br /&gt;  - jabber, other pooling tech, security tech, alerts if laptops leaves it will shut down unless it can reconnect to school server after some period of time&lt;br /&gt;  - backs up other laptops, allows teacher monitoring etc&lt;br /&gt;  - mic jack doubles as voltmeter&lt;br /&gt;&lt;br /&gt;Regional Vision&lt;br /&gt;---------------&lt;br /&gt;  - Great need in the region&lt;br /&gt;  - Build a strong developer and educator community&lt;br /&gt;  - e.g. indigenous communities and children in impoverished areas&lt;br /&gt;&lt;br /&gt;5000 laptops donated to regional project, trials include many pacific island communities&lt;br /&gt;Providing sat networking to some of the most remote areas&lt;br /&gt;Some potential to travel with OLPC and contribute in the community, volunteers needed&lt;br /&gt;wiki.laptop.org/go/OLPC_Oceania&lt;br /&gt;&lt;br /&gt;Consideration of cultural values&lt;br /&gt;--------------------------------&lt;br /&gt;&lt;br /&gt;When rolling out, most pacific culture has healthy respect for teacher as the leader&lt;br /&gt;&lt;br /&gt;Try to make sure teachers get the device early, extensive trainining, teacher is the person that gives the children the resource rather than from random externals.&lt;br /&gt;&lt;br /&gt;Fit with what groups are already trying to achieve with their schools&lt;br /&gt;&lt;br /&gt;Australia's first trial is happening&lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;A single laptop by itself doesn't have so much value, need classroom environment&lt;br /&gt; e.g. spelling tests, collaborative writing activity&lt;br /&gt;&lt;br /&gt;World's first remote-connected classroom. That is, the local teacher is connected to remote classrooms, video chat etc.&lt;br /&gt;&lt;br /&gt;Video demo of remote classroom showing flashcard spelling exercises with student&lt;br /&gt;&lt;br /&gt;Observed benefits to children&lt;br /&gt;-----------------------------&lt;br /&gt;Educational:&lt;br /&gt; - Literacy improvements&lt;br /&gt; - ICT skills -- typing, programming, games&lt;br /&gt; - Maths&lt;br /&gt; - Collaboration&lt;br /&gt;&lt;br /&gt;Behavioural:&lt;br /&gt; - Engagement of troubled children&lt;br /&gt; - Reduced truancy&lt;br /&gt;&lt;br /&gt;Example of Python shell where you just run demo code then  change it yourself as an exercise&lt;br /&gt;&lt;br /&gt;Example of a particular troubled kid from a very disadvantaged background who engaged through the laptop environment, partly because he could engage with his interest area, partly because the laptop was his, that he could use according to his own preferences and progress in his own time.&lt;br /&gt;&lt;br /&gt;Benefits of a regional process:&lt;br /&gt;-------------------------------&lt;br /&gt;Funding, support, access to volunteers, knowledge xfer&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-6003351527994124320?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/6003351527994124320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=6003351527994124320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6003351527994124320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6003351527994124320'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc-liveblogging-olpc-in-australia.html' title='OSDC liveblogging: OLPC in Australia'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5540371597738091016</id><published>2008-12-05T14:08:00.002+11:00</published><updated>2008-12-05T14:30:34.378+11:00</updated><title type='text'>OSDC liveblogging: Your code sucks and I hate you</title><content type='html'>Your code sucks and I hate you&lt;br /&gt;&lt;br /&gt;First time patch submitted to OS project:&lt;br /&gt;  - nerve-wracking experience, judgement&lt;br /&gt;  - having people look at your code, give feedback etc is very powerful and important, best tool we have to get better as programmers&lt;br /&gt;&lt;br /&gt;What's a review?&lt;br /&gt;  - Anyone even just talking about code&lt;br /&gt;  - A few types&lt;br /&gt;  - Involuntary review&lt;br /&gt;  - Random inspection&lt;br /&gt;  - Post-merge&lt;br /&gt;  - Pre-trunk (really good way of working, how bzr works)&lt;br /&gt;  - Pre-merge is the new hotness&lt;br /&gt;  - Enforces conformity (style consistent, ensures quality, enhance clarity)&lt;br /&gt;  - Moves from 1 person who understands code to 2 people&lt;br /&gt;&lt;br /&gt;A few things in code review than can cause social problems&lt;br /&gt;  - Being told your entire approach is wrong&lt;br /&gt;  - Better to have a conversation before coding starts&lt;br /&gt;  - While you're there, totally do something else also&lt;br /&gt;    * need to be allowed to fix small incremental issues&lt;br /&gt;    * unclear outcomes (ie "this is bad", not what about it is bad)&lt;br /&gt;  - Name-calling is bad, doesn't help, talk about code not people&lt;br /&gt;  - Confusing personal preference with objective worth&lt;br /&gt;  - Filibustering -- what happens when you are outnumbered, but can win an argument by talking lots&lt;br /&gt;  - Lag is bad, reviews need to be fast, lag builds up&lt;br /&gt;  - Need to know who are the reviewers&lt;br /&gt;&lt;br /&gt;Good things (how to do good reviews)&lt;br /&gt;  - Specific feedback&lt;br /&gt;  - Be thankful for code submits&lt;br /&gt;  - Ask questions where you don't understand stuff&lt;br /&gt;  - Before you start coding, talk to someone about it. Anyone.&lt;br /&gt;  - Decide to who gets the final say to head off future conflicts&lt;br /&gt;&lt;br /&gt;Questions:&lt;br /&gt;  - Worst have experienced professionally is "that's a stupid idea"&lt;br /&gt;  - Language barriers can be an issue&lt;br /&gt;  - What happens if there are not enough developers for review?&lt;br /&gt;  - Generally in favour of doing code reviews in public or opt-out forum&lt;br /&gt;  - Be specific regarding thanking people also i.e. "I'm looking forward to using this feature"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5540371597738091016?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5540371597738091016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5540371597738091016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5540371597738091016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5540371597738091016'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc-liveblogging-your-code-sucks-and-i.html' title='OSDC liveblogging: Your code sucks and I hate you'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-2827719814565621473</id><published>2008-12-05T13:34:00.001+11:00</published><updated>2008-12-05T13:39:25.260+11:00</updated><title type='text'>OSDC liveblogging: Natural language generation in weather forecasting</title><content type='html'>Yesterday, I was unwell so I didn't keep up with my presentation blogging. Here is my presentation on Natural language generation in weather forecasting.&lt;br /&gt;&lt;br /&gt;&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=d95jbb3_62g2pmkdf6' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-2827719814565621473?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/2827719814565621473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=2827719814565621473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2827719814565621473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2827719814565621473'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc-liveblogging-natural-language.html' title='OSDC liveblogging: Natural language generation in weather forecasting'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5496690266335001357</id><published>2008-12-05T11:35:00.003+11:00</published><updated>2008-12-05T11:59:23.483+11:00</updated><title type='text'>OSDC liveblogging: Legal Issues in OS</title><content type='html'>Brendan Scott, OS lawyer based in Sydney. (opensourcelaw.biz)&lt;br /&gt;[n.b. this is particular to Australian law]&lt;br /&gt;&lt;br /&gt;* Some analogy about driving to a location with a bit of suboptimal route planning. Many decisions along the way.&lt;br /&gt;&lt;br /&gt;* When engaging a lawyer, this is like reading a map before setting out&lt;br /&gt;* Not always necessary / justified, this depends on a bunch of things&lt;br /&gt;  - familiar territory?&lt;br /&gt;  - time and cost?&lt;br /&gt;&lt;br /&gt;Hypothetical business growth path:&lt;br /&gt; - start&lt;br /&gt; - build it up&lt;br /&gt; - sell it&lt;br /&gt;&lt;br /&gt;Setting up an incorporated vehicle makes things (significantly) easier&lt;br /&gt;The word "partnership" has a specific legal meaning, including:&lt;br /&gt;  - you are personally liable for your partners actions in the business&lt;br /&gt;  - best to avoid unless want to be in this specific relationship&lt;br /&gt;&lt;br /&gt;How would you react to someone taking code from a project you are working on?&lt;br /&gt;  - If you have good record-keeping, can sort out rights relatively easily, even if you don't have a copyright record. Just need records of activity and can bootstrap copyright attribution&lt;br /&gt;&lt;br /&gt;Contracts take effect at the time of signing&lt;br /&gt;&lt;br /&gt;The conduct of a negotiation limit the things you can say in the future to try and vary the contract -- i.e. major points have been ventilated. Difficult to bring lawyer in at this stage to make nontrivial changes.&lt;br /&gt;&lt;br /&gt;What else might a lawyer do for you?&lt;br /&gt;  - Dispute Resolution. Often a case of identifying what the problem is and identifying win-win or least-loss outcomes&lt;br /&gt;  - Sometimes knowledge of the law is extremely relevant&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5496690266335001357?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5496690266335001357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5496690266335001357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5496690266335001357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5496690266335001357'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc-liveblogging-legal-issues-in-os.html' title='OSDC liveblogging: Legal Issues in OS'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-3866808283286247262</id><published>2008-12-05T11:16:00.002+11:00</published><updated>2008-12-05T11:30:44.884+11:00</updated><title type='text'>OSDC liveblogging: The State of Python</title><content type='html'>Presentation by Anthony Baxter&lt;br /&gt;&lt;br /&gt;* 2.5.2 changes came from App Engine&lt;br /&gt;* The Big News&lt;br /&gt;   - 3.0 is done&lt;br /&gt;   - .X releases are backward-compatible&lt;br /&gt;   - 2.6.1 almost out&lt;br /&gt;   - tinyurl.com/python3&lt;br /&gt;&lt;br /&gt;IronPython continues on merry way&lt;br /&gt;* Really fast&lt;br /&gt;* Visual Studio is great&lt;br /&gt;* First major bit of software with a decent license (pretty much Berkely)&lt;br /&gt;* Targets 2.5&lt;br /&gt;* Mostly works on Mono&lt;br /&gt;&lt;br /&gt;Upgrade code:&lt;br /&gt;&lt;br /&gt;* Take old code&lt;br /&gt;* Port to 2.6&lt;br /&gt;* Use -3 flag to show warnings&lt;br /&gt;* Fix those&lt;br /&gt;* Then run 2to3 -- rewrites code to 3 compat&lt;br /&gt;* django is out for 3&lt;br /&gt;&lt;br /&gt;Demo of upgrade to small app and highlight some specific changes&lt;br /&gt;* print is a function&lt;br /&gt;* print("foo", end="")&lt;br /&gt;* __repr__ --&gt; repr builtin, backticks gone&lt;br /&gt;&lt;br /&gt;What's the future?&lt;br /&gt;------------------&lt;br /&gt;2.6.1 soon, 2.5 final not far off&lt;br /&gt;3.0.1 a few months away&lt;br /&gt;&lt;br /&gt;d.items() returns a dictionary view&lt;br /&gt;&lt;br /&gt;If you want to learn python, learn in Python 3. New book coming out soon from someone who has been tracking python 3 for some time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-3866808283286247262?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/3866808283286247262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=3866808283286247262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3866808283286247262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3866808283286247262'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc-liveblogging-state-of-python.html' title='OSDC liveblogging: The State of Python'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8966603805534072984</id><published>2008-12-04T12:03:00.002+11:00</published><updated>2008-12-04T12:30:16.232+11:00</updated><title type='text'>OSDC liveblogging: Bazaar (VCS)</title><content type='html'>Gentle introduction to version control using Bazaar&lt;br /&gt;Michael Hudson from Canonical&lt;br /&gt;&lt;br /&gt;What is Bazaar?&lt;br /&gt;Distributed VCS&lt;br /&gt;No privileged sentral location&lt;br /&gt;aims to be safe, friendly, free and fast&lt;br /&gt;&lt;br /&gt;'bzr init'&lt;br /&gt;'bzr add'&lt;br /&gt;'bzr ci -m "initiam import"'&lt;br /&gt;&lt;br /&gt;'bzr push' uploads or updates branch data on the server&lt;br /&gt;'bzr branch' - get a copy of a remote branch&lt;br /&gt;'bzr pull'&lt;br /&gt;'bzr merge'&lt;br /&gt;&lt;br /&gt;Some concepts&lt;br /&gt;-------------&lt;br /&gt;&lt;br /&gt;WorkingTree - collection of version controlled files and directories&lt;br /&gt;Revision - A snapshot of a working tree and the fundamental object in bazaar&lt;br /&gt;Branch - An ordered series of revisions&lt;br /&gt;Repository - A place where revisions are stored&lt;br /&gt;Commit - create a new snapshot/revision&lt;br /&gt;Delta - the difference between two revisions&lt;br /&gt;Merge - determining the outstanding revisions in one branch and applying them to another&lt;br /&gt;&lt;br /&gt;* Can run a centralised model, then works quite like SVN&lt;br /&gt;&lt;br /&gt;* Or, can run semi-centralised&lt;br /&gt; - Mainline or trunk reflects current mainline&lt;br /&gt; - New features developed in own branch&lt;br /&gt; - Patch Queue Manager (PWM) can enforce this / guard a branch&lt;br /&gt;&lt;br /&gt;* Full distributed&lt;br /&gt; - Developers maintain their own branches&lt;br /&gt; - Share / Merge p2p&lt;br /&gt; - Can still use PQM to maintain a test-suite protected mainline branch&lt;br /&gt;&lt;br /&gt;* Mixed-mode obviously possible&lt;br /&gt;&lt;br /&gt;Advantages&lt;br /&gt;----------&lt;br /&gt;Don't need to give people commit rights to trunk to allow them to contribute (can send their revisions to other developers directly via 'bzr send')&lt;br /&gt;&lt;br /&gt;A Bit About Launchpad&lt;br /&gt;---------------------&lt;br /&gt;A web-based tool to support open source software development&lt;br /&gt;Designed to scale&lt;br /&gt;&lt;br /&gt;Steps:&lt;br /&gt;* Register launchpad id&lt;br /&gt;* Register SSH keys&lt;br /&gt;* Create branches, push/pull&lt;br /&gt;&lt;br /&gt;Get some things for free:&lt;br /&gt;* Server maintenance&lt;br /&gt;* Web view of branch&lt;br /&gt;* Branch notifications (commit mails)&lt;br /&gt;* Simple access control through teams&lt;br /&gt;* Support for code reviews&lt;br /&gt;* Has email interface&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8966603805534072984?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8966603805534072984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8966603805534072984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8966603805534072984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8966603805534072984'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc-liveblogging-bazaar-vcs.html' title='OSDC liveblogging: Bazaar (VCS)'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7095745607468688053</id><published>2008-12-03T15:29:00.001+11:00</published><updated>2008-12-03T15:32:12.126+11:00</updated><title type='text'>OSDC Liveblogging: Openspatial software overview</title><content type='html'>------------------------------------&lt;br /&gt;Generally about Open Projects:&lt;br /&gt;- Are there procedures to contribute code?&lt;br /&gt;- i.e. how useful is the project really&lt;br /&gt;&lt;br /&gt;------------------------------------&lt;br /&gt;Content Servers&lt;br /&gt;------------------------------------&lt;br /&gt;OSGeo&lt;br /&gt;Mapserver, ,Mapbender, WMS, WFS, WCS&lt;br /&gt;&lt;br /&gt;Simple features for sql (SFSQL)&lt;br /&gt;SQL Multi Media Extensions&lt;br /&gt;&lt;br /&gt;PostGIS (e.g. used to capture MARS ROVER data, rocket science, important)&lt;br /&gt;&lt;br /&gt;GML, SML, GeoRSS, etc&lt;br /&gt;GeoServer is a fully features j2ee geospatial data server&lt;br /&gt;&lt;br /&gt;UMN MapServerr, original mover &amp; shaker, high performance&lt;br /&gt;&lt;br /&gt;deegree (with two e's) web services is quite comprehensive&lt;br /&gt;&lt;br /&gt;GeoNetwork is good for discovering data, is being funded by an Aus govt group&lt;br /&gt;&lt;br /&gt;------------------------------------&lt;br /&gt;Applications&lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;JUMP / OpenJUMP (closed development)&lt;br /&gt;GRASS running since 1982&lt;br /&gt;QGIS&lt;br /&gt;gvSig, open-source funded with 30mil euros public money&lt;br /&gt;uDig, Eclipse RPC based&lt;br /&gt;jGrass&lt;br /&gt;&lt;br /&gt;------------------------------------&lt;br /&gt;Thin clients&lt;br /&gt;------------------------------------&lt;br /&gt;OpenLayers is best bet to plug into variety of web-based mapping tools (important)&lt;br /&gt;MapBender&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next year: FOSS4G 2009, Sydney, 500-700 delegates, yearly gathering of the tribes&lt;br /&gt;&lt;br /&gt;In response to query regarding gridded data, suggested:&lt;br /&gt;OSSIM: Gridded&lt;br /&gt;GRASS has raster support&lt;br /&gt;GAL+ODR, one of which has raster formats&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7095745607468688053?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7095745607468688053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7095745607468688053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7095745607468688053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7095745607468688053'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/openspatial.html' title='OSDC Liveblogging: Openspatial software overview'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-2299715932172258495</id><published>2008-12-03T15:11:00.001+11:00</published><updated>2008-12-03T15:11:50.912+11:00</updated><title type='text'>OSDC liveblogging, Unittest: An under-appreciated gem</title><content type='html'>Unittest: An under-appreciated gem&lt;br /&gt;Andrew Bennetts&lt;br /&gt;&lt;br /&gt;What makes a good unit test suite?&lt;br /&gt;- readable: intent and implementation is clear&lt;br /&gt;- reliable: pass/fail when it shoud&lt;br /&gt;- usable: easy to run, fast, debuggable&lt;br /&gt;&lt;br /&gt;Very quick overview of unittest:&lt;br /&gt;- Subclass unittest.TestCase&lt;br /&gt;- def setUp(self): foo&lt;br /&gt;- def a bunch of methods (will all be test cases)&lt;br /&gt;- single unit test is represented by a TestCase instance&lt;br /&gt;- then run tearDown&lt;br /&gt;- report the result to a TestResult object&lt;br /&gt;&lt;br /&gt;TestResult: passed to methods, record success details&lt;br /&gt;TestLoader: turns test methods int TestCase subclasses into test cases&lt;br /&gt;something else: is glue&lt;br /&gt;&lt;br /&gt;Why is this good?&lt;br /&gt;- Standard, most other frameworks will interoperate with it, batts included&lt;br /&gt;- Not Python-centric, xUnit implementation, general programmer awareness&lt;br /&gt;- Encourages good structure in tests&lt;br /&gt;- By default, tests are isolated from eachother&lt;br /&gt;- Easy to reuse a test fixture definition between multiple tests (reuse setUp and tearDown)&lt;br /&gt;- Group tests by common needs&lt;br /&gt;- test cases have explicit names, so clearer reporting, can be specific about what failed &amp; where&lt;br /&gt;&lt;br /&gt;Unittest is pretty easy to extend.&lt;br /&gt;- extensions have a good chance of being fairly compatible with other test frameworks&lt;br /&gt;- examined addCleanup logic, add cleanup code immediately after, e.g., adding a lock&lt;br /&gt;- (Bazaar extension) multiply_test_suite_by_scenarios is a function that takes a test suite and a list of scenarios&lt;br /&gt;&lt;br /&gt;A couple of extra libs worth knowing about&lt;br /&gt;- launchpad.net/testtools: miscellaneous extensions from various projects&lt;br /&gt;- launchpad.net/subunit: runs unit tests in separate processes to support test isolation&lt;br /&gt;- launchpad.net/testresources: is a library to manage the initialisation and lifetime of expensive text fixtures&lt;br /&gt;&lt;br /&gt;Some bits are bad:&lt;br /&gt;- no standard tool to load and invoke a test suite&lt;br /&gt;- parts of the API could be better (lots of 3rd party stuff needed)&lt;br /&gt;- set of built-in assertions is a bit small&lt;br /&gt;- documentation in the std lib is a bit weak&lt;br /&gt;&lt;br /&gt;- fundamentally quite capable, pretty easy to usefully extend, would be great to get extensions back into std lib.&lt;br /&gt;- launchpad.net/pyunit-friends&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-2299715932172258495?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/2299715932172258495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=2299715932172258495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2299715932172258495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/2299715932172258495'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc-liveblogging-unittest-under.html' title='OSDC liveblogging, Unittest: An under-appreciated gem'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5999162941102915730</id><published>2008-12-03T13:17:00.001+11:00</published><updated>2008-12-03T13:22:21.915+11:00</updated><title type='text'>OSDC liveblogging - my GAE+ExtJS presentation</title><content type='html'>I think it went okay. My presentation covers and introduction to these technologies.&lt;br /&gt;&lt;br /&gt;&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=d95jbb3_53crbdfqcv' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5999162941102915730?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5999162941102915730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5999162941102915730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5999162941102915730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5999162941102915730'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc-liveblogging-my-gaeextjs.html' title='OSDC liveblogging - my GAE+ExtJS presentation'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-3782235830427003457</id><published>2008-12-03T09:08:00.003+11:00</published><updated>2008-12-03T09:49:15.065+11:00</updated><title type='text'>OSDC liveblogging -- Keynote by Chris DeBona</title><content type='html'>Chris DeBona oversees open-source license compliance at Google CA.&lt;br /&gt;&lt;br /&gt;This presentation talks about how useful OS is to Google. Starts presentation with hardware history of Google, showing Linux ancestry. Current systems are big rack systems, but still running customised linux software with heaps  of OS libraries involved.&lt;br /&gt;&lt;br /&gt;Google has found about 3.5 billion lines of OS code in unique files, which is more than any of the big players individually have written. &lt;br /&gt;&lt;br /&gt;In 2000, asked 10k sourceforge developers about their motivations:&lt;br /&gt;  * Intellectual curiosity / stimulation&lt;br /&gt;  * skills improvement&lt;br /&gt;  * work needs&lt;br /&gt;  * non-work functionality&lt;br /&gt;  * professional status&lt;br /&gt;  * reputation building&lt;br /&gt;  * distrust / dislike of proprietary software&lt;br /&gt;&lt;br /&gt;Means that OSS developers understand OSS licenses&lt;br /&gt;&lt;br /&gt;How does Google use open source?&lt;br /&gt;  * Linux kernel&lt;br /&gt;  * Apache&lt;br /&gt;  * Languages &amp; compilers&lt;br /&gt;  * Engineers who run linux (Goobuntu)&lt;br /&gt;&lt;br /&gt;Also, when releasing code:&lt;br /&gt;  * Android, Gears, apps&lt;br /&gt;&lt;br /&gt;Does this to maintain independence from external software company&lt;br /&gt;Allows you as a software company to do something out of the ordinary without showing your hand / without external dependencies&lt;br /&gt;&lt;br /&gt;How does Google take part?&lt;br /&gt;--------------------------&lt;br /&gt;&lt;br /&gt;8.5 million lines of code released in Android&lt;br /&gt;Release about 1 million lines of code outside of that&lt;br /&gt;Important for engineers to be able to interact with peers in the community, not get out of touch&lt;br /&gt;Provides good code hosting with version control, issue tracking, wiki&lt;br /&gt;Hires some people directly because they are seen as important&lt;br /&gt;Sponsors GSOC -- create new OS developers&lt;br /&gt;&lt;br /&gt;Questions&lt;br /&gt;---------&lt;br /&gt;&lt;br /&gt;Why didn't Google create their own open source license?&lt;br /&gt;  * Don't trust licenses that arent's used much&lt;br /&gt;  * Real combination problems when integrating projects&lt;br /&gt;  * Not everyone trusts Google, so using well-understood licenses is good for this&lt;br /&gt;  * Obvious what Google means by using a license as people are familiar with them&lt;br /&gt;  * Developers don't need to understand new legal terms, familiar with known licenses&lt;br /&gt;  * Uses Apache a lot because it has specific things to say about patents (personal comment -- helps avoid patent issues -- not exactly sure how but seems to provide some end-user protection against patent infringement through using the software)&lt;br /&gt;&lt;br /&gt;Now running out of battery, so posting now...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-3782235830427003457?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/3782235830427003457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=3782235830427003457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3782235830427003457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3782235830427003457'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc-liveblogging-keynote-by-chris.html' title='OSDC liveblogging -- Keynote by Chris DeBona'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7569373702043586231</id><published>2008-12-03T08:48:00.002+11:00</published><updated>2008-12-03T08:56:30.852+11:00</updated><title type='text'>OSDC08 Day One</title><content type='html'>Yesterday (Tuesday 2 Dec, Sydney AUS) was day one of the OSDC 08 conference. It began with a Google Hackathon, where a few Googlers presented some of their latest technologies. These includes both open source projects which they sponsor (or at least contribute developer time) and closed-source but free-access systems. These systems were: &lt;br /&gt;  * OpenSocial&lt;br /&gt;  * Something about an open map layer system&lt;br /&gt;  * AppEngine&lt;br /&gt;&lt;br /&gt;This was pretty neat, and I successfully copied-and-pasted my way to a functioning OpenSocial application which would allow me to give my friends virtual acorns in a variety of social network containers. Google make available a number of things to make this easier, including comprehensive examples, a number of free hosting solutions and a sandbox environment for Orkut to deploy test applications. &lt;br /&gt;&lt;br /&gt;I haven't been active in this area of development before, but a great deal of the complexity of managing such an application has been stripped away to allow any potential developer to concentrate on application functionality instead of systems maintenance.&lt;br /&gt;&lt;br /&gt;Following this, I visited the Google offices as a part of the Sydney Python User's Group meeting. At this meetup I presented on the topic of AI in Python. At this stage, I prefer not to make my slides web-available but would be happy to supply them via email to anyone at the presentation or who would like to engage on the topic offline. Since AI is such a huge area, with so many potential audiences, there is a lot of ground for misinterpretation of a slide or bullet point if taken out of context. I had great fun however, and greatly enjoyed catching up with everyone at the pub afterwards.&lt;br /&gt;&lt;br /&gt;Props to Christoph, Mark, Alan, Richard, Mark, Matt, Alex, Joel and everyone else that I met whose names I can't right now recall. Thanks for making my stay a nice one!&lt;br /&gt;&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7569373702043586231?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7569373702043586231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7569373702043586231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7569373702043586231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7569373702043586231'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/12/osdc08-day-one.html' title='OSDC08 Day One'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-3460464270758633247</id><published>2008-11-27T09:54:00.001+11:00</published><updated>2008-11-27T19:18:04.470+11:00</updated><title type='text'>IT is not like upgrading a car, like designing a house</title><content type='html'>I would contend that IT problems tend to be organisational problems rather than technology problems. Upgrading your IT is not like upgrading your car, where you just get better performance from your wheels, accelerator and brake. Rather, upgrading your IT is like designing a house. Yes, new houses are often built from better components, but you still need good design that meets your particular needs. To some extent you can buy off the plan, but the result is never as good as working closely with the architect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-3460464270758633247?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/3460464270758633247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=3460464270758633247' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3460464270758633247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3460464270758633247'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/11/it-is-not-like-upgrading-car-like.html' title='IT is not like upgrading a car, like designing a house'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-272993072062239658</id><published>2008-11-13T20:57:00.002+11:00</published><updated>2008-11-13T21:07:17.810+11:00</updated><title type='text'>Book Meme</title><content type='html'>INSTRUCTIONS:&lt;br /&gt;&lt;br /&gt;    * Grab the nearest book.&lt;br /&gt;    * Open it to page 56.&lt;br /&gt;    * Find the fifth sentence.&lt;br /&gt;    * Post the text of the sentence in your journal along with these instructions.&lt;br /&gt;    * Don’t dig for your favorite book, the cool book, or the intellectual one: pick the CLOSEST.&lt;br /&gt;&lt;br /&gt;"Not only is the flowering of global science and technology not an exclusively Western-led phenomenon, there were major global advances in the world that involved extensive international encounters away from Europe".&lt;br /&gt;&lt;br /&gt;This week finds me reading "Identity and Violence" by Amartya Sen (subtitled "The Illusion of Destiny"). Last week would have found me reading Terry Pratchett, which probably would have made for better blogvertainment...&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-272993072062239658?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/272993072062239658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=272993072062239658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/272993072062239658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/272993072062239658'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/11/book-meme.html' title='Book Meme'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5877418207360807865</id><published>2008-11-12T09:46:00.001+11:00</published><updated>2008-11-12T09:48:46.562+11:00</updated><title type='text'>Mashup idea: library catalague with book reviews</title><content type='html'>I'd like to see a really good book review site that could talk to my local library catalogue system, so that I could check out what highly-reviewed books my library currently has available for loan, and perhaps even use it at the basis for purchasing requests. Just another way that Things Could be Better! :)&lt;br /&gt;&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5877418207360807865?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5877418207360807865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5877418207360807865' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5877418207360807865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5877418207360807865'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/11/mashup-idea-library-catalague-with-book.html' title='Mashup idea: library catalague with book reviews'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8319082658990850984</id><published>2008-11-06T10:10:00.002+11:00</published><updated>2008-11-06T10:22:03.166+11:00</updated><title type='text'>Pythonista, pythoneer... pythonite</title><content type='html'>Another noun for describing a python afficionado. See http://www.wordinfo.info/words/index/info/view_unit/1096 .&lt;br /&gt;&lt;br /&gt;As in socialite, canaanite.&lt;br /&gt;&lt;br /&gt;Also related to the rare substance Pythonium, the pure essence of Python in mineral form. Pythonite is a substance created from Pythonium. Consuming Pythonite (or refined Pythonium) can lead to greatly enhanced productivity. Hence the somewhat ambiguous term Pythonite may refer either to a Python afficionado or the mineral substance formed when Pythonium is present in the natural environment.&lt;br /&gt;&lt;br /&gt;Can react energetically with Perlite despite its proximity on the programmatic table of elements.&lt;br /&gt;&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8319082658990850984?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8319082658990850984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8319082658990850984' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8319082658990850984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8319082658990850984'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/11/pythonista-pythoneer-pythonite.html' title='Pythonista, pythoneer... pythonite'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7448099725932202441</id><published>2008-11-05T11:58:00.003+11:00</published><updated>2008-11-05T12:07:41.614+11:00</updated><title type='text'>More on soft exceptions</title><content type='html'>I had a real-world problem just now which I chose to tackle using soft exceptions. I have a series of rules which transform a data object. Depending on the state of the data object, not all the rules are applicable. Also, depending on the rule, it may or may not be critical to have the rule applied to the data object.&lt;br /&gt;&lt;br /&gt;While pursuing another task, I caused an exception inside a method which applied one of these rules. Rather than simply track back the exception and add more handling to the code, I decided to *also* wrap this rule in a soft exception handler. In operations, it would be far better to simply not apply the rule than to cease processing and crash, yet the rule logic is written such that any error causes a program fault.&lt;br /&gt;&lt;br /&gt;Ideally, I would implement the soft exception handling using a logger level which could be applied application-wide, but that is a bigger task than I wanted to tackle in 10 minutes!&lt;br /&gt;&lt;br /&gt;So, I wrote:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;exceptionMode = "Soft"&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;  originalState = object.state&lt;br /&gt;  // Apply rule logic&lt;br /&gt;&lt;br /&gt;except:&lt;br /&gt;  object.state = originalState&lt;br /&gt;&lt;br /&gt;  if exceptionMode == "Soft":&lt;br /&gt;    print "NEW WARNING -- generated in MyClass.methodName&lt;br /&gt;    print "Methodname failed. Original state is being used."&lt;br /&gt;    traceback.print_exc()&lt;br /&gt;    print "END WARNING"&lt;br /&gt;&lt;br /&gt;  else:&lt;br /&gt;    raise&lt;br /&gt;&lt;br /&gt;return successFlag&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This worked beautifully! I can check the code in with soft exceptions turned on, so that in operations any bugs here will only result in a rule failure, not a complete process failure. However, I still have access to the full stack trace through logging and can also set the exception mode to "Hard" (or anything that's not "Soft") and have 'brittle' behaviour for testing.&lt;br /&gt;&lt;br /&gt;Score 1 for soft exceptions!&lt;br /&gt;&lt;br /&gt;Clearly, it would be ideal to log instead of print. It would be good to have have the following logging controls:&lt;br /&gt;  * Hard or soft exception handling&lt;br /&gt;  * A logging level which would actually bring up user warning dialogs&lt;br /&gt;  * A variety of logging detail levels&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7448099725932202441?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7448099725932202441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7448099725932202441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7448099725932202441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7448099725932202441'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/11/more-on-soft-exceptions.html' title='More on soft exceptions'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-1943521041323099801</id><published>2008-11-03T13:34:00.002+11:00</published><updated>2008-11-03T14:04:49.214+11:00</updated><title type='text'>Meme: Top Five Software Possibilities</title><content type='html'>Here's a quick meme... List the top five things that (you believe) could be feasibly achieved with a software R&amp;D investment in the order of $30 million. Please list a time frame for any particularly big ideas. They could be your top five moneymakers, top five in terms of benefit for society, or anything -- it's YOUR top five :)&lt;br /&gt;&lt;br /&gt;  1. Flawless text-to-speech rendering. Could be done in four years, will take 15 otherwise.&lt;br /&gt;  2. Driverless cars. Could be done in six years, will take 40 otherwise.&lt;br /&gt;  3. Complete automation of the tax system. Maybe six years?&lt;br /&gt;  4. Creation of fully anonymous, publicly available medical research datasets.&lt;br /&gt;  5. Create an artificial mind. Could be done in ten years, but may never be done.&lt;br /&gt;&lt;br /&gt;What are your top five?&lt;br /&gt;&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-1943521041323099801?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/1943521041323099801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=1943521041323099801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1943521041323099801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1943521041323099801'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/11/meme-top-five-software-possibilities.html' title='Meme: Top Five Software Possibilities'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-3834146621843570111</id><published>2008-11-02T19:02:00.003+11:00</published><updated>2008-11-02T19:08:58.504+11:00</updated><title type='text'>My project: GAE-JSON</title><content type='html'>URL: &lt;a href="http://code.google.com/p/gae-json/"&gt;http://code.google.com/p/gae-json/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The project is really not ready for public consumption, but I have noticed another project called gae-json-rest which is turning up on Google search. So that others can find my project by searching for it, I just needed to create a couple of links to it so that it will be available. Not, of course, that I'm being competitive -- but if I don't put some links up then there will be a lot of confused visitors to the gae-json-rest project!&lt;br /&gt;&lt;br /&gt;If anyone feels very enthusiastic about the project, there *are* a couple of functional examples which anyone could install on their system, but they will need some guidance first. By the time OSDC08 comes around, however, I intend to have turned this around into something which is really genuinely user-friendly. I should add to the list of my goals:&lt;br /&gt;  * Create a hosted demo&lt;br /&gt;  * Put together a wizard / walkthrough&lt;br /&gt;  * Create some documentation&lt;br /&gt;&lt;br /&gt;However, goals at the moment will still be those relating to functionality...&lt;br /&gt;&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-3834146621843570111?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/3834146621843570111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=3834146621843570111' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3834146621843570111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3834146621843570111'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/11/my-project-gae-json.html' title='My project: GAE-JSON'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-4716314244204208164</id><published>2008-10-31T16:45:00.002+11:00</published><updated>2008-10-31T16:54:06.131+11:00</updated><title type='text'>This close to a datastore --&gt; json server on google apps engine</title><content type='html'>Phew ... a good afternoon's hacking.&lt;br /&gt;&lt;br /&gt;I am *this close* to completing a very basic prototype of a json server for google apps engine. The idea is that you visit a URL which contains the query you want to evaluate (hence my previous post) and get back a JSON encoding of the data. Obviously, that's for requests only.&lt;br /&gt;&lt;br /&gt;However, what it *means* is that you can then write an AJAX client which can interface directly to a GAE data store. And *that* is a good thing.&lt;br /&gt;&lt;br /&gt;Sure, it's about as functional as a car with no steering wheel, but in principle it works. I have achieved the following goals:&lt;br /&gt;  * Store some data in the data store&lt;br /&gt;  * Retrieve it with a GQL query&lt;br /&gt;  * Write a web server which decodes a query from the URL in hex&lt;br /&gt;  * Use that to retrieve said data from the query store&lt;br /&gt;  * Render the data to a web page in HTML&lt;br /&gt;  * Render the a json string to the web page (or json-looking, anyway)&lt;br /&gt;&lt;br /&gt;The following goals remain:&lt;br /&gt;  * Write a version which emits the json string with appropriate mime type&lt;br /&gt;  * Write a javascript client which retrieves the data and renders it in a web page&lt;br /&gt;  * Put up some vaguely comprehensible web pages explaining the thing and demonstrating its use&lt;br /&gt;  * Make the store/retrieval more general by:&lt;br /&gt;    -- Not relying on a specific database structure&lt;br /&gt;    -- Going beyond string-only data&lt;br /&gt;    -- Do something about INSERT queries&lt;br /&gt;&lt;br /&gt;I'm having some fun with this. Anyone who is interested, let me know and I can keep you posted of progress. I think it should be really useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-4716314244204208164?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/4716314244204208164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=4716314244204208164' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4716314244204208164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4716314244204208164'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/10/this-close-to-datastore-json-server-on.html' title='This close to a datastore --&gt; json server on google apps engine'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7319508298595226972</id><published>2008-10-31T14:44:00.002+11:00</published><updated>2008-10-31T14:54:38.612+11:00</updated><title type='text'>Efficient encoding of URL arguments</title><content type='html'>I would like to have URLs which look like:&lt;br /&gt;  "http://web.host/queryhandler/Tnidf3445ssx34" or something similar. That last part should be some reasonably space-efficient encoding of something like "SELECT * from FOO where CONDITION"&lt;br /&gt;&lt;br /&gt;I have found I can get part-way using Python's encode and decode functions, e.g.&lt;br /&gt;  encoded = "SELECT * from FOO where CONDITION".encode("hex")&lt;br /&gt;  decoded = encoded.decode("hex")&lt;br /&gt;&lt;br /&gt;However, the resulting values are still a bit long. This method quite nearly removes nonprintable characters, spaces etc from the URL. However, I have this nagging feeling that I could be doing some compression along the way to make the encoded part shorter. For example, HEX uses only part of the alphanumeric space. I'd like to use the digits 0-9 and letters a-z and A-Z ideally.&lt;br /&gt;&lt;br /&gt;Let's just make this clear -- for no very good reason that I can justify, I want to encode a query as the shortest possible string using printable, alphanumeric characters (and no spaces) and be able to simply decode the string also.&lt;br /&gt;&lt;br /&gt;"The Internet" has told me about md5 hashing, but I need a two-way function here. The help on string.encode in Python simply says I can specify the name of any encoder, but I can't find a list of the default encoders available.&lt;br /&gt;&lt;br /&gt;Any ideas, internet?&lt;br /&gt;&lt;br /&gt;Cheers and thanks in advance,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7319508298595226972?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7319508298595226972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7319508298595226972' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7319508298595226972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7319508298595226972'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/10/efficient-encoding-of-url-arguments.html' title='Efficient encoding of URL arguments'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-9160216712914389892</id><published>2008-10-30T13:54:00.002+11:00</published><updated>2008-10-30T13:56:48.108+11:00</updated><title type='text'>OSDC 2008 pre-conference activities</title><content type='html'>I notice that the OSDC conference days have dropped from the 1st - 5th&lt;br /&gt;to the 2nd to the 5th as the conference schedule has been firming up.&lt;br /&gt;I find myself now with a free day on the 1st. I wonder if there are&lt;br /&gt;any Pythonistas in Sydney who would care to catch up on that day for a&lt;br /&gt;discussion group, BoF sessions or anything else? Looking at the&lt;br /&gt;program, it seems to have fewer of such events than past conferences.&lt;br /&gt;There are some available slots for these sessions, but if anyone wants&lt;br /&gt;to get together for some more in-depth discussions, I'd be up for it.&lt;br /&gt;&lt;br /&gt;I'd be very interesting in informal sessions on the following topics:&lt;br /&gt; * Open source in government&lt;br /&gt; * Weather forecasting&lt;br /&gt; * AJAX development&lt;br /&gt; * Artificial intelligence&lt;br /&gt; * Advanced Python skills&lt;br /&gt; * Open Source &amp; Project Management&lt;br /&gt;&lt;br /&gt;I have also posted this message to various Australian Python mailing lists. So far there are two takers for some activities on the Monday. If interested parties can email me, I will see if there are enough takers to organise some small-group discussions on topics of interest. So far the takers are 1 for Open Source in Government and another for AI.&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;-Tennessee Leeuwenburg&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-9160216712914389892?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/9160216712914389892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=9160216712914389892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9160216712914389892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/9160216712914389892'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/10/osdc-2008-pre-conference-activities.html' title='OSDC 2008 pre-conference activities'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-4233399383322893369</id><published>2008-10-29T14:14:00.003+11:00</published><updated>2008-10-29T14:17:06.693+11:00</updated><title type='text'>Automatic text generation is live!</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;The system which I have been working on for three years has just gone live. My component of this system generates text forecasts automatically, based on gridded forecast data which is initialised from model conditions and then manipulated by weather forecasters. Any particular text forecast may also be edited by the forecasters after generation, but the bulk of the forecasts are published without forecaster intervention in the text.&lt;br /&gt;&lt;br /&gt;Examples include the Melbourne forecast,&lt;br /&gt;  http://www.bom.gov.au/products/IDV10450.shtml&lt;br /&gt;&lt;br /&gt;A number of other Victorian town forecasts, Victorian district forecasts and an expanded set of Precis and Town forecasts are also produced. Also, a larger number of forecast days are included for many of these locations.&lt;br /&gt;&lt;br /&gt;This page (http://www.bom.gov.au/nextgen/) describes some of the changes to service which come with the new forecast system.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-4233399383322893369?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/4233399383322893369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=4233399383322893369' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4233399383322893369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4233399383322893369'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/10/automatic-text-generation-is-live.html' title='Automatic text generation is live!'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8060042479617321835</id><published>2008-09-26T15:10:00.003+10:00</published><updated>2008-09-26T15:14:40.227+10:00</updated><title type='text'>Code, wiki style</title><content type='html'>I've got this use case for editing code through a web interface, like a wiki. I thought I'd find out if anyone else has thought about this topic, and didn't see anything jump out at me when searching.&lt;br /&gt;&lt;br /&gt;The situation is that maybe there's an open-source or perhaps just shared-development project in a workplace, hosted on the cloud. Rather than each person having an IDE set up for them or accessing a CVS repository, they just have a web interface.&lt;br /&gt;&lt;br /&gt;Maybe the system requires logins to track changes, or in the first instance maybe it just allows unrestricted and un-tracked editing.&lt;br /&gt;&lt;br /&gt;Does anyone know of such a system? Ideally, the server code would be written in Python (I'm trying to set up a Python-only technology stack for reasons of minimalism) but I would be interested in non-Python systems. I don't mind if the interface is fairly primitive to start with, but it would be neat if it did include some additional features such as syntax highlighting.&lt;br /&gt;&lt;br /&gt;What do people think?&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8060042479617321835?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8060042479617321835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8060042479617321835' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8060042479617321835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8060042479617321835'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/09/code-wiki-style.html' title='Code, wiki style'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-798674381120949384</id><published>2008-09-16T13:41:00.002+10:00</published><updated>2008-09-16T13:44:07.296+10:00</updated><title type='text'>search through code, search through comments</title><content type='html'>Dear lazyweb,&lt;br /&gt;&lt;br /&gt;I would love it if I could search through my code using my IDE, with the following options:&lt;br /&gt;  * Search all text in files&lt;br /&gt;  * Search only comments&lt;br /&gt;  * Search only non-comment code&lt;br /&gt;&lt;br /&gt;My current favourite IDE is Eclipse/PyDev, but I'm not sure where to lodge queries easily, so here's my message in a bottle for the relevant developers. God speed, little bottle!&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-798674381120949384?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/798674381120949384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=798674381120949384' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/798674381120949384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/798674381120949384'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/09/search-through-code-search-through.html' title='search through code, search through comments'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-1462195592084788685</id><published>2008-09-15T15:31:00.002+10:00</published><updated>2008-12-02T13:49:46.341+11:00</updated><title type='text'>OSDC 2008 GAE + ExtJS code samples</title><content type='html'>This page contains links to demonstration applications developed for OSDC 2008, including:&lt;br /&gt;&lt;br /&gt;  * JSON server written in Python integrated with GAE and the Document Store&lt;br /&gt;  * Basic ExtJS form submission to Google Document Store&lt;br /&gt;&lt;br /&gt;For GAE-JSON SVN server, visit: http://code.google.com/p/gae-json/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-1462195592084788685?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/1462195592084788685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=1462195592084788685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1462195592084788685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1462195592084788685'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/09/osdc-2008-gae-extjs-code-samples.html' title='OSDC 2008 GAE + ExtJS code samples'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-7257894338497184779</id><published>2008-08-27T13:35:00.003+10:00</published><updated>2008-08-27T13:54:58.766+10:00</updated><title type='text'>Soft exceptions</title><content type='html'>Something that I would like to consider for the future is an idea I call soft exceptions. They are probably industry standard already and I'm just the last to know, but here's the idea.&lt;br /&gt;&lt;br /&gt;Many times I want to execute a block of code which does something, but not something important. If I'm writing some important piece of software, I don't want problems in unimportant code areas bubbling up to cause big problems in areas that *are* important. This can be managed by writing great code, having an entire bureacracy of test scripts and good defensive coding habits. Or you can just wrap the whole lot in a try statement and best practises be be blowed.&lt;br /&gt;&lt;br /&gt;I've got this idea that there can be a middle ground -- a way of being able to protect your important code when it's live and being relied upon (other than by just not having errors happen) while not putting in kludge after kludge to keep the motor running.&lt;br /&gt;&lt;br /&gt;The idea is, basically, that exception handling would be linked to the logging system, and that whether an exception was fatal or not would depend on the logging/debug level set.&lt;br /&gt;&lt;br /&gt;For example, I might have a code loop which is something like the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;while(True):&lt;br /&gt;     doSomethingReallyImportant()&lt;br /&gt;&lt;br /&gt;     try:&lt;br /&gt;          doSomethingNotVeryImportant()&lt;br /&gt;     except KnownFailureMode:&lt;br /&gt;          print "Sorry, there is no wheat in the hopper"&lt;br /&gt;     except:&lt;br /&gt;          log("Something not very important broke unexpectedly")&lt;br /&gt;&lt;br /&gt;          if logLevel = "soft":&lt;br /&gt;               log('soft exceptions, see traceback')&lt;br /&gt;               log(traceback.format_exc())&lt;br /&gt;          else:&lt;br /&gt;               raise&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This code would&lt;br /&gt;  a) Protect the important code in the loop&lt;br /&gt;  b) Respond to known failure modes&lt;br /&gt;  c) Log everything&lt;br /&gt;  d) Re-raise unexcpected exceptions if in debug mode&lt;br /&gt;  e) Suppress unimportant things if in operational/critical mode&lt;br /&gt;&lt;br /&gt;I could even imagine "fallback mode' operations which could be user-enabled which would enable hard exception handling....&lt;br /&gt;&lt;br /&gt;Just some thoughts....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-7257894338497184779?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/7257894338497184779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=7257894338497184779' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7257894338497184779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/7257894338497184779'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/08/soft-exceptions.html' title='Soft exceptions'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8171738842597732085</id><published>2008-08-15T11:51:00.003+10:00</published><updated>2008-08-15T11:54:12.906+10:00</updated><title type='text'>Melbourne-based Javascript experts</title><content type='html'>Hi lazyweb,&lt;br /&gt;&lt;br /&gt;I was wondering if there are any Melbourne-based javascript experts who would be able to help me with a bit of learning. I could really benefit from being able to pick someone's brain for a few hours, with problems in front of me etc. I don't want a training course, just a kind of expert tutor for some assistance. I'd be happy to pay a fair hourly rate for the time spent of course. Google a.k.a. the Internets didn't really have any obvious promising leads, so I'm hoping this might find its way into the inbox of a real person who could help me out. God speed, message in a bottle!&lt;br /&gt;&lt;br /&gt;Email me at tleeuwenburg@gmail.com.&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8171738842597732085?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8171738842597732085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8171738842597732085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8171738842597732085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8171738842597732085'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/08/melbourne-based-javascript-experts.html' title='Melbourne-based Javascript experts'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8698164275355589213</id><published>2008-05-30T15:41:00.002+10:00</published><updated>2008-05-30T16:03:45.957+10:00</updated><title type='text'>Web application design philosophy - HELP!?</title><content type='html'>Full disclosure: I started developing web apps like two days ago. This post is written as a n00b, not as a source of authority.&lt;br /&gt;&lt;br /&gt;Not to be intimidated, I got out my slate and chalk, and began doing screenshot designs for a rich internet application (RIA) I want to write. I found myself some whizzbang technology, in this case Google Apps Engine and the Extjs javascript widget framework. They're both pretty easy to work with (so long as you don't need to do any debugging) and I managed to prototype myself some pages to do Neat Stuff.&lt;br /&gt;&lt;br /&gt;I'm now faced with a difficult path to actually learning how to write a web application "properly". With a standalone GUI app, I'm pretty much fine with application design, breaking things up into an MVC model and then doing an object-oriented design of each bit. With a web application, it's not so clear how I should do things.&lt;br /&gt;&lt;br /&gt;If I were designing something in static HTML, all the logic goes on the web server. The user clicks "load data" and the web server goes and produces a static HTML page showing the data loaded.  The application brain is in the server, and the purpose of the HTML page is to render the user interface to the client.&lt;br /&gt;&lt;br /&gt;It appears possible to basically do the complete opposite with javascript, and put basically all the processing logic into the javascript, treating the web server as just something to go fetch resources from.&lt;br /&gt;&lt;br /&gt;So should the logic go?&lt;br /&gt;&lt;br /&gt;I'm worried that if I pursue a heterogenous design, whereby the application logic is split between client and server, that I will then have an unsatisfactory level of coupling between the two. Should the database be the 'model', the web server be the 'controller' and the client be the 'view'?&lt;br /&gt;&lt;br /&gt;Presumably, if I put heaps of logic into the javascript, then network overhead will be high but latency will be good? Whereas perhaps if I do it the other way, network overhead will be low but many more requests will be necessary, thus slowing application responsiveness?&lt;br /&gt;&lt;br /&gt;Where do XML web services and SOAP requests come in? "Should" I be using these as an API, or should I just request data and perform my processing in javascript?&lt;br /&gt;&lt;br /&gt;How do I write a web application such that it is reasonably 'pluggable' -- that is such that I could alter my choice of server, database or javascript extension library without killing myself?&lt;br /&gt;&lt;br /&gt;Should I use something like Django's templating to control the GUI or should I put all the GUI design into my javascript? Should there be a javascript object representing the whole application which then loads the navbar, display and other widgets?&lt;br /&gt;&lt;br /&gt;Should I do form processing on the web server, or in the javascript?&lt;br /&gt;&lt;br /&gt;ARGHHH!&lt;br /&gt;&lt;br /&gt;I think, maybe, the index page should be a trad "web page" kind of page, with links to the RIA pages.&lt;br /&gt;&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8698164275355589213?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8698164275355589213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8698164275355589213' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8698164275355589213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8698164275355589213'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/05/web-application-design-philosophy-help.html' title='Web application design philosophy - HELP!?'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5579307368517894126</id><published>2008-05-28T19:54:00.002+10:00</published><updated>2008-05-28T19:58:12.888+10:00</updated><title type='text'>OSDC 2008</title><content type='html'>From 1 to 5 Dec, in Sydney, Australia, the Open Source Developer's Conference 2008 will be held (http://osdc.com.au/2008). I will, in all probability, be attending this. I would love to get in touch with any other Pythoneers who may be going. It would be fantastic to organise some group sessions and do some networking. Also, if there's anyone else who works for the Aus govt it would be good to hear about what kind of open source applications are getting a guernsey in your depts.&lt;br /&gt;&lt;br /&gt;I thought it would be neat if we could find some leading Aussie python people and rope them into giving a panel talk on some topic, leading a discussion or some such.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5579307368517894126?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5579307368517894126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5579307368517894126' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5579307368517894126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5579307368517894126'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/05/osdc-2008.html' title='OSDC 2008'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-6529485657858725200</id><published>2008-05-20T16:52:00.002+10:00</published><updated>2008-05-20T17:00:56.474+10:00</updated><title type='text'>Advanced Document Notes</title><content type='html'>I just started a Google App Engine trial and my goal is to prototype an application I've always wanted. If it works, I will even use it. It's really simple to explain -- I want to take notes against documents. Then, I want fulltext search through everything.&lt;br /&gt;&lt;br /&gt;There are files. Some are public some are private. Let's assume they are all PDF articles that I want to write about.&lt;br /&gt;&lt;br /&gt;There is a common document store and a private document store. Documents can be shared, and you can read eachother's notes! Yay! But some are private, because sharing them would be bad for some reason. So you have access to the global store (which is like a wiki) and the private store.&lt;br /&gt;&lt;br /&gt;Okay, so you log in, and can upload a file. Yay! Then you take notes against it, which is stored in a notes file and related to the original file.&lt;br /&gt;&lt;br /&gt;Then, you can have a display where the PDF is viewed on the left and the notes are viewed on the right.&lt;br /&gt;&lt;br /&gt;So, you could share something like a PDF, text file, web page or even binary media file, and share comments on it. I envisage it as being great for the following uses:&lt;br /&gt;&lt;br /&gt;  1) An academic who wants to create a personal store of research notes&lt;br /&gt;  2) An academic who wants to collaborate on creating research notes, such as with fellow researchers or students&lt;br /&gt;  3) Anyone who wants to share comments about files.&lt;br /&gt;  4) A workplace where a group wants to share around a file for comment&lt;br /&gt;&lt;br /&gt;I just hope I can find time to actually do this. I don't think it will be particularly hard, but neither do I have a lot of free time.&lt;br /&gt;&lt;br /&gt;Anyway, cool! GAE!&lt;br /&gt;&lt;br /&gt;I'm trying not to think of any additional functionality at this stage, but ideas keep popping into my head anyway.&lt;br /&gt;&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-6529485657858725200?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/6529485657858725200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=6529485657858725200' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6529485657858725200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6529485657858725200'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/05/advanced-document-notes.html' title='Advanced Document Notes'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5530184422555391425</id><published>2008-03-23T15:13:00.003+11:00</published><updated>2008-03-23T15:17:33.652+11:00</updated><title type='text'>Requirement: Taking notes against a document</title><content type='html'>Here's a tool that I want. It's simple, and clearly useful. I study, as do many people, and I think the use case goes further. I have documents, which I don't need to edit -- e.g. articles and papers. I need to take notes against these documents. Further, I would like to be able to search within the body of documents and notes. I want to be able to create an articles hom directory (~articles). I then want to be able to have my own subdirectory structure (~articles/subject). I then want to be able to create notes files that are associated with each article. Then, I want a search tool (like Beagle or Google Desktop) which will constrain itself to ~articles, and know about the association between notes files and articles. I want full-text search, with a link on the results page to both the article and the notes. That would be great!&lt;br /&gt;&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5530184422555391425?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5530184422555391425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5530184422555391425' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5530184422555391425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5530184422555391425'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/03/requirement-taking-notes-against.html' title='Requirement: Taking notes against a document'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-6350675681915260507</id><published>2008-02-20T12:19:00.001+11:00</published><updated>2008-02-20T12:19:42.712+11:00</updated><title type='text'>From my python interpreter</title><content type='html'>&gt;&gt;&gt; a = 1,2&lt;br /&gt;&gt;&gt;&gt; a&lt;br /&gt;(1, 2)&lt;br /&gt;&gt;&gt;&gt; a == 1,2&lt;br /&gt;(False, 2)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-6350675681915260507?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/6350675681915260507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=6350675681915260507' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6350675681915260507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6350675681915260507'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/02/from-my-python-interpreter.html' title='From my python interpreter'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-6619957746432639495</id><published>2008-01-25T11:42:00.000+11:00</published><updated>2008-01-25T11:45:21.429+11:00</updated><title type='text'>Article Notification: The Impact of Component Modularity on Design Evolution: Evidence from the Software Industry</title><content type='html'>This paper interested me and I thought it might interest others.&lt;br /&gt;&lt;br /&gt;Title: The Impact of Component Modularity on Design Evolution: Evidence from the Software Industry&lt;br /&gt;Authors: Alan MacCormack, John Rusnak, and Carliss Y. Baldwin&lt;br /&gt;URL: &lt;a href='http://hbswk.hbs.edu/item/5831.html'&gt;http://hbswk.hbs.edu/item/5831.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Executive Summary (from the site):&lt;br /&gt;&lt;br /&gt;What factors should influence the design of a complex system? And what is the impact of choices on both product and organizational performance? These issues are of particular importance in the field of software given how software is developed: Rarely do software projects start from scratch. The authors analyzed the evolution of a commercial software product from first release to its current design, looking specifically at 6 major versions released at varying periods over a 15-year period. These results have important implications for managers, highlighting the impact of design decisions made today on both the evolution and the maintainability of a design in subsequent years. Key concepts include:&lt;br /&gt;&lt;br /&gt;    * Data show strong support for the existence of a relationship between component modularity and design evolution.&lt;br /&gt;    * Tightly coupled components have a higher probability of survival as a design evolves compared with loosely coupled components.&lt;br /&gt;    * Tightly coupled components are also harder to augment, in that the mix of new components added in each version is significantly more modular than the legacy design.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-6619957746432639495?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/6619957746432639495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=6619957746432639495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6619957746432639495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/6619957746432639495'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/01/article-notification-impact-of.html' title='Article Notification: The Impact of Component Modularity on Design Evolution: Evidence from the Software Industry'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-3016761995581300215</id><published>2008-01-22T16:06:00.000+11:00</published><updated>2008-01-22T16:09:02.767+11:00</updated><title type='text'>comapping.com</title><content type='html'>I just found the most astoundingly useful web tool. There's a free 30-day trial and I highly, highly recommend that everyone take it for a spin. It is, essentially, an intuitive structured-note taking tool. It appears to create notes in a tree-based structure, with node types which correspond to projects, goals, tasks, notes, meeting agendas etc depending on your chosen template.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://comapping.com/"&gt;http://comapping.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-3016761995581300215?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/3016761995581300215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=3016761995581300215' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3016761995581300215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/3016761995581300215'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/01/comappingcom.html' title='comapping.com'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-4217117487244801836</id><published>2008-01-03T09:22:00.000+11:00</published><updated>2008-01-03T09:28:35.983+11:00</updated><title type='text'>Developing for userspace (linux-focused)</title><content type='html'>On great Python utility is virtual Python. It is a script which will take your system Python install and leverage that to create a Python binary in your home directory. The advantage is that you can then install all kinds of third-party libraries without (a) root permissions or (b) messing up your primary installation.&lt;br /&gt;&lt;br /&gt;It can be used to create several different "homes" for Python, which could let you experiment with library version, install procedures or a variety of other things.&lt;br /&gt;&lt;br /&gt;More people should develop for userspace.&lt;br /&gt;&lt;br /&gt;I was recently trying to install C#, something which I would love to learn. On linux this means mono. On a standard operating environment without root priveleges, this means a *lot* of dependencies (due to old versions of Stuff) and a lot of compiling.&lt;br /&gt;&lt;br /&gt;It would be great if RPM (and apt, or pick-your-favourite-installer) could handle the idea of a userspace package repository. Maybe they can and I don't know about it, but I've not seen any information on the topic. Things that get installed should have a userspace option. If I want to grab the latest gnome, mono and C# libraries into user-space without root priveleges, I should be able to. I should be crippled just because I'm not root. It doesn't seem beyond the capacity of linux to allow users to do this, since it already supports the userspace paradigm very well.&lt;br /&gt;&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-4217117487244801836?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/4217117487244801836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=4217117487244801836' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4217117487244801836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4217117487244801836'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2008/01/developing-for-userspace-linux-focused.html' title='Developing for userspace (linux-focused)'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-8764435920515651763</id><published>2007-12-20T12:37:00.000+11:00</published><updated>2007-12-20T12:45:36.944+11:00</updated><title type='text'>A project I would start if I could</title><content type='html'>LaTeX 2 ODT converter. Probably couldn't accept arbitrary LaTeX, but should at least be able to do headings, subheadings, lists and formulae/diagrams via images.&lt;br /&gt;&lt;br /&gt;This could easily be run as GSoC or GHOP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-8764435920515651763?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/8764435920515651763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=8764435920515651763' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8764435920515651763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/8764435920515651763'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2007/12/project-i-would-start-if-i-could.html' title='A project I would start if I could'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-1672715914376740104</id><published>2007-12-18T09:59:00.000+11:00</published><updated>2007-12-18T10:00:01.594+11:00</updated><title type='text'>Interview -- "Why They Do Python"</title><content type='html'>I was recently asked to participate in an interview of a panel of Python experts by Odin Jobs, a recruitment site. Happy to help raise the profile of Python, I accepted. The interview, which includes ten other Pythoneers, is now available at  &lt;a href="http://www.odinjobs.com/blogs/careers/entry/python_experts_why_they_do"&gt;http://www.odinjobs.com/blogs/careers/entry/python_experts_why_they_do&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-1672715914376740104?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/1672715914376740104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=1672715914376740104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1672715914376740104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/1672715914376740104'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2007/12/interview-why-they-do-python.html' title='Interview -- &quot;Why They Do Python&quot;'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5346131611262150094</id><published>2007-11-09T10:24:00.000+11:00</published><updated>2007-11-09T14:41:44.877+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>My entry for James Tauber's Competition</title><content type='html'>I coded up an entry for http://jtauber.com/programming_competition/. Averaged across the categories, I'm coming about fourth/fifth. I may or may not try to refine my algorithm further, but it was fun taking part. Here's my unpolished code for the world to throw rocks at.&lt;br /&gt;&lt;br /&gt;The algorithm is supposed to work on a reverse logic, considering which word affects the least number of verses and learning it last. It's too slow to handle the category four input file (I reckon it could take a week). I wrote a modified version which is much faster but does not perform as well.&lt;br /&gt;&lt;br /&gt;The major time code is recalculating the word frequencies in each step. If this could be sped up, the algorithm would be tractable for larger inputs. The modified version runs in just a few minutes.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def remove_partial_verses(known_words, verseDict):&lt;br /&gt;    known_set = set(known_words)&lt;br /&gt;    for verseID, wordSet in verseDict.items():&lt;br /&gt;        if known_set.intersection(wordSet):&lt;br /&gt;            del verseDict[verseID]&lt;br /&gt;&lt;br /&gt;def countWord(word, verseDict):&lt;br /&gt;    '''&lt;br /&gt;    This method counts the number of verses which contain the word&lt;br /&gt;    '''&lt;br /&gt;    count = 0&lt;br /&gt;    &lt;br /&gt;    for verse in verseDict:&lt;br /&gt;        # count the number of verses&lt;br /&gt;        wordSet = verseDict[verse]&lt;br /&gt;        if word in wordSet: count += 1        &lt;br /&gt;    &lt;br /&gt;    return count&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    importFile = sys.argv[1]&lt;br /&gt;&lt;br /&gt;    inputFile = file(importFile, 'r')&lt;br /&gt;    &lt;br /&gt;    wordDict = {}&lt;br /&gt;    verseDict = {}&lt;br /&gt;    &lt;br /&gt;    for line in inputFile:&lt;br /&gt;        verse, word = line.split()&lt;br /&gt;            &lt;br /&gt;        if verse in verseDict:&lt;br /&gt;            wordSet = verseDict[verse]&lt;br /&gt;            wordSet.add(word)&lt;br /&gt;            &lt;br /&gt;            verseDict[verse] = wordSet&lt;br /&gt;            &lt;br /&gt;        else:&lt;br /&gt;            verseDict[verse] = set([word])&lt;br /&gt;            &lt;br /&gt;        if word in wordDict:&lt;br /&gt;            verseSet = wordDict[word]&lt;br /&gt;            verseSet.add(verse)&lt;br /&gt;        &lt;br /&gt;        else:&lt;br /&gt;            wordDict[word] = set([verse])&lt;br /&gt;&lt;br /&gt;    totalWordSet = set(wordDict.keys())            &lt;br /&gt;    known_words = []&lt;br /&gt;&lt;br /&gt;    learn_order = []&lt;br /&gt;    &lt;br /&gt;    while(len(totalWordSet) &gt; 0):&lt;br /&gt;#        print "Length: ", len(totalWordSet)&lt;br /&gt;                &lt;br /&gt;        pairs = [(countWord(word, verseDict), word) for word in totalWordSet]    &lt;br /&gt;        pairs.sort()&lt;br /&gt;        &lt;br /&gt;        theWord = pairs[0][1]&lt;br /&gt;        learn_order.append(theWord)&lt;br /&gt;        known_words.append(theWord)&lt;br /&gt;        totalWordSet.discard(theWord)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        remove_partial_verses(known_words, verseDict)&lt;br /&gt;&lt;br /&gt;    for word in learn_order[::-1]:&lt;br /&gt;        print "learn ", word&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5346131611262150094?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5346131611262150094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5346131611262150094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5346131611262150094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5346131611262150094'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2007/11/my-entry-for-james-taubers-competition.html' title='My entry for James Tauber&apos;s Competition'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-4565718379023430170</id><published>2007-10-31T12:16:00.000+11:00</published><updated>2007-10-31T13:28:35.603+11:00</updated><title type='text'>NVIDIA drivers when upgrading from Feisty to Gutsy</title><content type='html'>This mysteriously stuffed up on my system. The key, it turned out, is that there is a new package name for the nvidia drivers. The old package is not replaced during the upgrade, nor does it totally fail. It just doesn't work right.&lt;br /&gt;&lt;br /&gt;The key is to turn off the proprietary driver, then turn it on again. This will trigger the de-installation of the old proprietary driver and the installation of the new package.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-4565718379023430170?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/4565718379023430170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=4565718379023430170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4565718379023430170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/4565718379023430170'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2007/10/nvidia-drivers-when-upgrading-from.html' title='NVIDIA drivers when upgrading from Feisty to Gutsy'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5104460239982939691</id><published>2007-10-29T16:54:00.000+11:00</published><updated>2007-10-29T16:57:58.680+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='extjs'/><title type='text'>ExtJs and Python</title><content type='html'>It appears that extjs (http://extjs.com) is the greatest thing since sliced bread.&lt;br /&gt;&lt;br /&gt;Since Python is also the greatest thing since sliced bread, they must be the same thing.&lt;br /&gt;&lt;br /&gt;My goal is to start using a Python backend to support an extjs frontend application of some kind. I'd love to hear from anyone else who has used extjs, especially if they have tried to integrate it into a Python web framework.&lt;br /&gt;&lt;br /&gt;I'll keep readers posted as I continue development of this application. It is likely to be very slow development, however, as I need to juggle a number of other responsibilities.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;-T&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5104460239982939691?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5104460239982939691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5104460239982939691' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5104460239982939691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5104460239982939691'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2007/10/extjs-and-python.html' title='ExtJs and Python'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2664598839700315760.post-5551625740204621087</id><published>2007-10-29T16:27:00.001+11:00</published><updated>2007-10-29T16:33:24.322+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>First Post -- Newsgroup/Blog integration</title><content type='html'>As Editor-In-Chief of The Python Papers, it is not always appropriate to blog everything I would like to the official blog. I have decided that I need another blog. Everything that goes in pythonpapers.blogspot.com is said with my Editor-In-Chief hat on. Everything said on this blog is said with my own hat on.&lt;br /&gt;&lt;br /&gt;I also ran melbournephilosopher.blogspot.com, but am no longer commenting on philosophical issues.&lt;br /&gt;&lt;br /&gt;One thing which I'd really like is the ability to link my blog posts with a newsgroup. It would be rather awesome if everything I blogged here would get posted to comp.lang.python, and all replies to that message got left here as blog comments. That would be tres cool.&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;-Tennessee&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2664598839700315760-5551625740204621087?l=myownhat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myownhat.blogspot.com/feeds/5551625740204621087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2664598839700315760&amp;postID=5551625740204621087' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5551625740204621087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2664598839700315760/posts/default/5551625740204621087'/><link rel='alternate' type='text/html' href='http://myownhat.blogspot.com/2007/10/first-post-newsgroupblog-integration.html' title='First Post -- Newsgroup/Blog integration'/><author><name>Tennessee Leeuwenburg</name><uri>http://www.blogger.com/profile/11384742711203790401</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry></feed>
