tag:blogger.com,1999:blog-101275022024-02-18T18:00:26.377-08:00In Small PortionsFleeting thoughts on technology and other stuff...Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-10127502.post-15921337623980395012013-10-14T09:30:00.000-07:002013-10-14T09:30:41.499-07:00PyCon IE Keynote SlidesHere are the slides from my <a href="http://python.ie/pycon/2013/">PyCon IE</a> 2013 keynote speach.
The code and resources used in the examples can be found <a href="https://docs.google.com/file/d/0B9i8yhDO03EcV2c5ak5oeVdSNGc/edit?usp=sharing">here</a>.<br />
<br />
<iframe src="https://docs.google.com/presentation/d/1BCt9T71hLpqTJmzX1xewlW3JXzEDGMDiCUSgG9cSuJI/embed?start=false&loop=false&delayms=3000" frameborder="0" width="410" height="342" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-84787052547185282512012-09-29T03:14:00.002-07:002012-09-29T03:14:14.174-07:00Big "A" Little "i": PyCon UK SlidesA number of people have asked me for them, so here are the slides from my <a href="www.pyconuk.org">PyCon UK</a> 2012 talk.<br />
<br />
<iframe src="https://docs.google.com/presentation/embed?id=1_1v_2zi56zvAwhXPLpPZLheL-aH7miABqsyBPcOpxy4&start=false&loop=false&delayms=3000" frameborder="0" width="410" height="342" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-88210436556024652752012-07-15T05:28:00.001-07:002012-07-15T05:31:53.737-07:00Big "A" Little "i": EuroPython slidesHere are the slides from my <a href="http://ep2012.europython.eu/">EuroPython</a> 2012 talk. Now that I have developed these ideas into a talk, I am not sure whether or not I will go back to complete the series I started on this topic. There was some interest in turning this material into a short training course, that is appealing to me as I was not happy with how brief I had to be to fit the ideas into a 45 minute talk.
<br />
<br />
<iframe src="https://docs.google.com/presentation/embed?id=1_1v_2zi56zvAwhXPLpPZLheL-aH7miABqsyBPcOpxy4&start=false&loop=false&delayms=3000" frameborder="0" width="410" height="342" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-66388664736281332002011-10-09T15:07:00.000-07:002011-10-09T15:07:34.533-07:00PyCon Ireland Slides (Once more with feeling!)This is largely the same as the slides I uploaded previously after PyCon UK, with some corrections and minor improvements.<br />
<br />
<iframe src="https://docs.google.com/present/embed?id=ddwn5t9f_41hhpwksg3&interval=5&loop=true" frameborder="0" width="410" height="342"></iframe>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-60584289790569828692011-09-25T03:33:00.000-07:002011-09-25T03:33:20.406-07:00PyCon UK Slides (Is this thing on?)Here are my slides from PyCon UK 2011. Next week after a rather long hiatus, I will resume the series on practical artificial intelligence.<br />
<br />
<div style="width:425px" id="__ss_9412211"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/tendayim/object-orientation-vs-functional-programming-in-python" title="Object Orientation vs Functional Programming in Python">Object Orientation vs Functional Programming in Python</a></strong><object id="__sse9412211" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=oovsfp-110925052720-phpapp02&stripped_title=object-orientation-vs-functional-programming-in-python&userName=tendayim" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse9412211" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=oovsfp-110925052720-phpapp02&stripped_title=object-orientation-vs-functional-programming-in-python&userName=tendayim" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/tendayim">Tendayi Mawushe</a>.</div></div>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-66030574793678899182010-12-05T13:46:00.000-08:002011-01-03T11:24:40.492-08:00Bid "A" Little "i" - Part IIIn <a href="http://www.insmallportions.com/2010/09/big-little-i-part-i.html">Part I</a> I gave <span style="color: black;">what I hope was</span> a convincing argument for why software developers should care about Ai. In this article I will show how looking at problems from an Ai perspective can yield immediate benefits. I will then introduce the fundamental tenet of Ai, the red thread that ties all the approaches I will discuss (and indeed those I will not) together. <br />
<br />
<br />
<b>It is Good to Talk</b><br />
<br />
A seemingly obvious but rather useful thing that Ai does for us as software developers is it equips us with ways of thinking about thought and ways of talking about thought. By giving the techniques and algorithms <span style="color: black;">we use names, it makes it easier to reason about them </span>and to discuss them. The discussion or communication aspect should be familiar to most software developers as it is widely considered one the major benefits of <a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29">Design Patterns</a>, it is similarly beneficial in Ai.<br />
<br />
An example of a rather simple algorithm that has been given a name in Ai is: <i><span style="color: black;">Generate and Test</span>. </i>Lets say your task is to recognise a specific make and models of cars given a set of features, what would you do? <span style="color: black;">Well, </span>you could build yourself the <a href="http://en.wikipedia.org/wiki/Rube_Goldberg_machine">Rube Goldberg machine</a> below.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6xQsFbQ_MxR_f3ujc41W-qaxFOurxM5zhjC2e6oIov0rpgc8RhIqk-cVW61EU98-sGOD4AjTBLEcQyHDG2pxJdLzI4928IoW1clII1BmTnoTBanCGAKF32UFF-qfEqSx7EDJ7/s1600/GenerateAndTest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6xQsFbQ_MxR_f3ujc41W-qaxFOurxM5zhjC2e6oIov0rpgc8RhIqk-cVW61EU98-sGOD4AjTBLEcQyHDG2pxJdLzI4928IoW1clII1BmTnoTBanCGAKF32UFF-qfEqSx7EDJ7/s400/GenerateAndTest.png" width="400" /></a></div><br />
So what does this device do? The Generator flips through all the pages of the popular car buyers and sellers magazine <a href="http://www.autotrader.com/">Autotrader</a>, it offers the cars on each page as possibilities to the Tester. The Tester takes each possibility from the <span style="color: black;">Generator and checks</span> its features to determine if it matches the type of car being searched for. Cars that don't match are discarded and the Tester moves on to the next possibility, once a match <span style="color: black;">is </span>found it presented as the result of the computation, if all the pages are exhausted but still no match is found no result is returned.<br />
<br />
Why glorify such as simple computation with a name? As we eluded to earlier it allows us to answer concisely questions like: "How are you going to solve this problem?". <span style="color: black;">We</span> can now answer: "I am going to solve this problem using Generate and Test". Even more importantly we can now talk precisely about the properties of the Generator and the Tester.<br />
<br />
Interesting properties of the <b>Tester</b> include:<br />
<ul><li> <i>Accuracy</i>: Do we require 100% accuracy or would 99% accuracy suffice? A Bayesian mathematician would tell you that 99% accuracy is is <a href="http://www.youtube.com/watch?v=4PwnvqGEHoU&feature=player_embedded#%21">definitely not good enough</a>!</li>
<li> <i>Speed</i>: A tester that contemplates each possibility for too long may not find a solution in a reasonable amount of time. </li>
</ul>Desirable properties of the <b>Generator</b> are:<br />
<ul><li><i>Complete:</i> If there exists a car in the world <span style="color: black;">we would</span> like our generator to produce it. By this measure our choice of using the Autotrader magazine might have been a bad one since it is unlikely that all possible cars types are always for sale in this magazine.</li>
<li><i>Inform-able:</i> If I am looking for a small hatchback it <span style="color: black;">does</span> not make sense to offer a van as a possibility to the tester, it <span style="color: black;">would be nice </span>if we could tell the generator that.</li>
<li><i>Non-Redundant:</i> We do not want the same car offered as a possibility more than once, as could happen if our page turner went through pages at random rather than in sequence.</li>
</ul>While it is helpful to be able to think and talk about ideas more freely, that is of course not the end of the story. Indeed it is but a single ice crystal on the tip of the iceberg, meant only to illustrate that you do not need to go far down the Ai road to get some real value.<br />
<br />
<br />
<b>Framing Problems</b><br />
<br />
One of the most important things human beings do in problem solving is framing questions in a way that makes them easier to solve. We are all aware of this intuitively from phrases like: "looking at it from another point of view I realised...". My thesis is that the ability to frame problems appropriately is the basis for intelligence and indeed genius. Problem framing is at the heart of most of the topics that I am going to cover over the next few posts. I would argue that one of the biggest problems for Artificial General Intelligence (which as you may remember from Part I is about artificial agents comparable to, or smarter than humans) is that our algorithms are not very good at framing problems for themselves. A human being has to frame the problem then the computer can do its thing. <span style="color: black;">This </span>limitation places an upper bound on how intelligent an artificial agent can be.<br />
<br />
This limitation is however perfectly acceptable for the masquerade of intelligence that I am interested in here. For our purposes we need to make the concept of problem framing more concrete, hence heretofore I will refer to <b>Representations</b> instead. To show how choosing the right representation is key to solving problems in general and in particular to conditioning problems for solution by a computer another example is order.<br />
<br />
Most children have seen the puzzle of the farmer, the fox, the goose and the grain. All four are on one side of a river and the farmer wants to get all of them to the other side of the river<span style="color: black;"> (</span>I always wondered why the farmer was ferrying a fox around<span style="color: black;">)</span>. However the fox if left alone with the goose will eat it, the goose if left alone with the grain will eat it. A child would probably solve the problem relatively quickly by trial and error. What we need to do though is condition the problem for solving by a computer, we need a <b>representation</b>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmRDJsg1PrRWBMefGOJ9uldcQz_OryRjSV86JidY4CgZG0s-Dt3RCHIT0X0-Sw_7-C-1FJIjvbBOVCAvboq_1g2I2Jzg4S7pG1bg4bthbt5FIlVGFU6bEiQ8y3dhiQOjCIZhGc/s1600/FrFxGsGr1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmRDJsg1PrRWBMefGOJ9uldcQz_OryRjSV86JidY4CgZG0s-Dt3RCHIT0X0-Sw_7-C-1FJIjvbBOVCAvboq_1g2I2Jzg4S7pG1bg4bthbt5FIlVGFU6bEiQ8y3dhiQOjCIZhGc/s320/FrFxGsGr1.png" width="263" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><br />
This representation looks promising as it makes explicit which side of the river everyone is on, lets see if we can use it to make progress with the puzzle. We did not mention it earlier but to get across the river the farmer must take the other across in a boat that has only room for two. What happens if our robot farmer takes whatever happens to be nearest to him across the river, in this case that is the fox: <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinLd5BUHjpfQ3SECPNBTIeoMQyFNrhyphenhyphen_HQoIz6-66pxgBEqLH0Gp62dTFG0L16MVPMBRJrJzzcYPwKfMFHgzM6EeTltTV79_eOlb2GZ4ME2f3jmoduMikcT-1TOKQyHMCF9lMD/s1600/FrFxGsGr2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinLd5BUHjpfQ3SECPNBTIeoMQyFNrhyphenhyphen_HQoIz6-66pxgBEqLH0Gp62dTFG0L16MVPMBRJrJzzcYPwKfMFHgzM6EeTltTV79_eOlb2GZ4ME2f3jmoduMikcT-1TOKQyHMCF9lMD/s320/FrFxGsGr2.png" width="263" /></a></div><br />
This didn't work out too well, the goose was left unattended to feast on the grain - <span style="color: black;">game over</span>, we lost. Even though we lost the game, the representation has exposed an important <b>constraint</b> that might be obvious to us humans but must be explicitly stated for an Ai farmer, things that eat each other cannot be on the same side of the river without the farmer also being there. Our representation is serving us well so far, it has exposed constraints that we can exploit to solve the problem. The constraint shows which state transitions are valid and which ones are not:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEqpPuW2ds57Q7JRphhIKnuectsqBptldnZENGjcqmYofLuxr0E9SxWO7o8BcRKwck2u5AoIpkvv6cJHxlvo4r7KvkqnF1DrM0_6LR63ggluh8xTL1B7EJIZeyF98oSUAjntlz/s1600/NotOk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="155" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEqpPuW2ds57Q7JRphhIKnuectsqBptldnZENGjcqmYofLuxr0E9SxWO7o8BcRKwck2u5AoIpkvv6cJHxlvo4r7KvkqnF1DrM0_6LR63ggluh8xTL1B7EJIZeyF98oSUAjntlz/s400/NotOk.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipLEerSIzk60NuQkDkCWPTGFupNcOn46LftMeBY25JLdpCNmPVzhJeprGJfV0iXU7e18slc9MLMva7Iw15WcPCg0l8dBbcHrVtUVsU5QpOjVBEHcSBQ4CuBiD5bVAIpmXOY6lk/s1600/Ex1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"></div><br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8HVsG4jdUiBVSdghvJTvoR23JsI2nCVVX7elOBQUEmqiE2hU6TSWcqRQTKkNeyBa1KrvpM69vb5yNRLQL1N_nKBdgIsFpCgPdr0lKkn38cldlwveRQ1SKDsg70xgZNYD1kD1J/s1600/Ok.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8HVsG4jdUiBVSdghvJTvoR23JsI2nCVVX7elOBQUEmqiE2hU6TSWcqRQTKkNeyBa1KrvpM69vb5yNRLQL1N_nKBdgIsFpCgPdr0lKkn38cldlwveRQ1SKDsg70xgZNYD1kD1J/s400/Ok.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitWjChXE9Mf1dDIiAgKYpM1om6kxwST4jv9W5ks4JV6-pOUZRFSOgY80CuNF7CaBcsHhDaf3ZkH9gApHhu3uZuJtv3hUKqQI_SDCUKIvpvgsNV881bdWbKIkpEN6gAJLb17a7w/s1600/Ex2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"></div>There is really not much left for us to do<span style="color: black;"> to fully </span>program our robot farmer. The problem can now be solved as a series of valid transitions between states involving the farmer moving from one side of the river to another. Once an appropriate <b>representation</b> has been chosen it is often a mechanical process to get to the solution, standard computer science algorithms (searching, sorting, finite state machines an so on) exploiting the <b>constraints</b> exposed are all that is required to take us the rest of the way.<br />
<br />
It may seem like overkill to solve this rather simple puzzle which could be expressed in a few "if-else" statements in the manner we have but it is not! Take another look at what we have done, we have taken the puzzle and generalized it into a good representation and the constraints the representation exposes. This means we can solve any puzzle of this nature without any change to the code. Even if we change the entire cast, just by adding the knowledge of who eats who, <span style="color: black;">that new puzzle is automatically solved.</span><br />
<br />
An even more important point to note is that the person programming the farmer robot does not need to be able to solve the puzzle. They solve the problem at a different level, I doubt for example that any of the engineers that worked on <a href="http://en.wikipedia.org/wiki/Deep_Blue_%28chess_computer%29">Deep Blue</a> were chess grandmasters. This is not such a big win for a simple puzzle like this, however there are problems which human beings cannot solve because of the time it would take, the errors a human would introduce, the amounts of data that need to be processed or host of other reasons. Hence Ai gives us the ability to solve problems that would otherwise be impossible to tackle!<br />
<br />
We have seen how to get some quick wins out of Ai thinking and introduced the central concept of representations (as well as the ancillary concept of constraints). Having set the scene in Part I and given a technical introduction to Ai in this article the coming instalments will cover the main classical Ai techniques.Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-45528705628421707672010-09-26T11:26:00.000-07:002010-09-27T05:50:30.704-07:00Big "A", Little "i" - Part IBack in the 1980's there was a bubble in the technology industry that was to prove a good model for the dot-com bubble that would follow a couple of decades later. The 1980's bubble was due to the excitement and promise of Artificial Intelligence (AI). Thanks to some rather impressive but narrowly focused programs there was a feeling that the age of thinking machines was upon us. Investors and technologists alike rushed to get in on the act, a lot of money was spent, made and lost. People thought that AI technology would change the world<a href="#world"><sup>1</sup></a>, but when it didn't change the world overnight much the interest faded away. Of course it did not help that in the excitement a lot of money was spent on functional but rather basic software, like rudimentary Expert System shells.<br />
<br />
The parallels with the dot-com bubble are obvious, a new technology comes along that seems like it will change the way we live, work and play, everyone gets overexcited, but it all comes to naught. Except... that it is not true! We know the rest of the story, the boom-bust cycle was just a capitol markets phenomenon and belies the fact there was real revolution taking place. Today we have internet companies that have market capitalisations in the tens of billions so clearly there was value there. Furthermore that is just the direct value to companies whose businesses are focused on the internet. There another fundamental shift from a technology perspective that is less conspicuous but more pervasive. Most software today has to be internet enabled, it is either entirely web-based or connects to web-services. Users now expect the richer experience enabled by the web, applications that sit entirely on the user's desktop with no gateway to the outside world seem dated and quaint.<br />
<br />
The web is so integral that almost every working programmer must be at least aware of the technologies underlying it. I would argue that the same can be said about AI, though its importance is a little more subtle. The AI in most systems tends to be obscured, partly because it is not directly visible from the user interface, partly due to its nature<a href="#smart"><sup>2</sup></a> and partly because usually it does not make up a large part of the system. However a lot of the worlds most interesting software is only possible because of AI. AI systems are in use today in fields such as: flight control, manufacturing robots, search engines, fraud detection, medical diagnosis and games to name but a few. It is like raisins in a loaf of Raisin Bread - they may not occupy a large part of the volume of the bread, but you cannot have Raisin Bread without raisins!<br />
<br />
Now you say to me: but AI has failed to make progress over the past few decades, where are those thinking machines and robots, show me the robots! Now we are getting to the crux of the matter, for AI <b>can</b> be about understanding and emulating human intelligence but it does not have to be! Indeed my thesis is that there are two closely related<a href="#related"><sup>3</sup></a> but nevertheless distinct sides to AI, the Science of AI and the Business of AI.<br />
<br />
From the science perspective of trying to understand and emulate human cognition there may seem to be very little progress being made, but that is a misconception<a href="#misconception"><sup>4</sup></a> which unfortunately I do not have time to discuss in detail here. At any rate this aspect of AI is often referred to as <a href="http://agi-conf.org/2011/">Artificial General Intelligence</a>, but I like to think of it as <b><span style="font-size: large;">aI</span></b> little "a", big "I". That is because there is not that much that is artificial about this endeavour, the ultimate goal is to understand cognition to the point where we can create an artificial agent that thinks at human level and beyond.<br />
<br />
The business of AI is what I think people interested in creating smart applications should be aware of. In contrast to the science of <b>aI</b>, the goal here is to build applications and machines that appear to be intelligent. Since in this case we only care about intelligence in the context of the specific application being built, this type of AI is typically referred to as <a href="http://www.agiri.org/wiki/Narrow_AI">Narrow Artificial Intelligence</a>. I like to think of it however as <b><span style="font-size: large;">Ai</span></b>, big "A", little "i". Since the applications and machines only need to appear intelligent, so it is definitely artificial. Also the means by which this is achieved is not that important, a cheap trick that works is as worthy as an actual intelligent agent. I hope I did not give you the impression that I am down on <b>Ai</b>, quite the opposite! The techniques of AI used in narrow contexts are what enable the applications I mentioned earlier and many more besides. Without an understanding of basic AI algorithms, you may find yourself spending a lot of time creating unreliable and hard to maintain programs, that could be expressed in much simpler ways with standard AI techniques.<br />
<br />
OK, so that was a very long-winded way to say that working programmers should know something about AI. After all that there had better be a pay-off and there is. The next few instalments will be introductions to what I consider the most useful and generally applicable Ai techniques. Stuff that you are guaranteed to find useful because it has been useful thousands of times in the past. Stay tuned...<br />
<br />
<br />
<span style="font-size: x-small;"><a id="world">1.</a> And indeed it has, though perhaps not in the way people imagined back then!</span><br />
<br />
<span style="font-size: x-small;"><a id="smart">2.</a> When you meet a really smart person you might exclaim "Wow! That girl is really smart", I doubt you have ever thought "Wow! That girl has a smart brain".</span><br />
<br />
<span style="font-size: x-small;"><a id="related">3.</a> Especially in terms of the techniques used, the research conducted and indeed the personnel involved.</span><br />
<br />
<span style="font-size: x-small;"><a id="misconception">4.</a> This is an argument better made by the people working on Artificial General Intelligence: <a href="http://singinst.org/">http://singinst.org</a>; <a href="http://www.idsia.ch/">http://www.idsia.ch</a></span>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-18743870962795674382010-07-17T08:47:00.000-07:002010-07-20T03:36:37.236-07:00Hot off the presses...Here are the slides of the Python Puzzlers talk I gave literally a few minutes ago at <a href="http://www.python.ie/pyconireland">PyCon Ireland</a>, I love the internet!<br />
<br />
<div id="__ss_4766349" style="width: 425px;"><b style="display: block; margin: 12px 0pt 4px;"><a href="http://www.slideshare.net/tendayim/python-puzzlers" title="Python Puzzlers">Python Puzzlers</a></b><object height="355" id="__sse4766349" width="425"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pyconireland2010-100715180048-phpapp01&rel=0&stripped_title=python-puzzlers" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4766349" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pyconireland2010-100715180048-phpapp01&rel=0&stripped_title=python-puzzlers" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><br />
<div style="padding: 5px 0pt 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/tendayim">Tendayi Mawushe</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNlEUGLT-COP-WDEA1OAaapr3k6ha63X89l6d8X7PVoIqM1gwB3rky5e90_aVF7qqL_E6rXc7wxhCL2mZaeCw5EgNqVrE2naY9aVHauAV93Mqm0RjDbcG6N3d69TbfXzjx6S4A/s1600/DSC_0662.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNlEUGLT-COP-WDEA1OAaapr3k6ha63X89l6d8X7PVoIqM1gwB3rky5e90_aVF7qqL_E6rXc7wxhCL2mZaeCw5EgNqVrE2naY9aVHauAV93Mqm0RjDbcG6N3d69TbfXzjx6S4A/s320/DSC_0662.JPG" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxyYVuY0jt5IeTKQlGcrDcrWu1NVP1rchu4Z9u3kVVlAOx-sAvzFOG7I6HVM3Ml4I9HfYK43LTm_BlaYEfHDe8ZYIqbVb5GMFWQJsKdc4EAiWehNP6o6kkrsYYiCyO36cmBttE/s1600/DSC_0659.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxyYVuY0jt5IeTKQlGcrDcrWu1NVP1rchu4Z9u3kVVlAOx-sAvzFOG7I6HVM3Ml4I9HfYK43LTm_BlaYEfHDe8ZYIqbVb5GMFWQJsKdc4EAiWehNP6o6kkrsYYiCyO36cmBttE/s320/DSC_0659.JPG" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFtoeHABiYcyhjHhqCUXtKUMUJHgp6ePPBMfRf5d02GgKisxpBZYHEyBDMMe5siniwMDoCErNY0Z9XRv13jyTTD4ld3lbXom-OrK-RizoqO4fztfvRLZmRToYzq6MDb4VxJkj8/s1600/DSC_0667.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFtoeHABiYcyhjHhqCUXtKUMUJHgp6ePPBMfRf5d02GgKisxpBZYHEyBDMMe5siniwMDoCErNY0Z9XRv13jyTTD4ld3lbXom-OrK-RizoqO4fztfvRLZmRToYzq6MDb4VxJkj8/s320/DSC_0667.JPG" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkucWNv1Cz9eToZoEISHMBr6zzvPVplvRUdirGYpr9Gl9x-gVAsAZOgYUK-HyNQSuy3oLm09e-CapKogkyZ9Pvm9GwQzsRgxjkE_GoCrU5TMSzhKRudwJPvXLA5Qe474pE-qDT/s1600/DSC_0675.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkucWNv1Cz9eToZoEISHMBr6zzvPVplvRUdirGYpr9Gl9x-gVAsAZOgYUK-HyNQSuy3oLm09e-CapKogkyZ9Pvm9GwQzsRgxjkE_GoCrU5TMSzhKRudwJPvXLA5Qe474pE-qDT/s320/DSC_0675.JPG" /></a></div></div></div>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-69996481228959347932010-07-14T14:38:00.000-07:002010-08-02T03:26:27.425-07:00Hearing is believing!A couple of weeks ago a few friends from the <a href="http://python.ie/">Python Ireland</a> community and I were interviewed for the <a href="http://www.codemongrel.com/">Code Mongrel</a> podcast. The discussion was entertaining (for us anyway) and wide ranging but also rather long. The editor did a fantastic job creating two great podcasts from the interview session.<br />
<br />
The first gave us an opportunity to plug the inaugural <a href="http://www.python.ie/pyconireland">PyCon Ireland</a> conference which is on this weekend, but we also discussed other interesting Python and Open Source topics: <a href="http://www.codemongrel.com/season-2-episode-3-on-pycon-ireland-2010-and-the-role-of-open-source/">On PyCon Ireland 2010 and the role of Open Source</a><br />
<br />
The second was more technical covering among other things, "dunder" methods, <a href="http://www.jetbrains.com/pycharm/">PyCharm</a>, alternative Python implementations and Python design patterns: <a href="http://www.codemongrel.com/season-2-episode-4-python-im-all-about-you-dude/">Python – I’m all about you, dude!</a><br />
<br />
I would encourage you to subscribe to the Code Mongrel podcast, this is the second season and they were many great podcasts before ours and there are sure to be more in the future.Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-1712853733703307842010-06-27T12:28:00.000-07:002010-09-08T00:53:24.543-07:00Walk a mile in a Lisp hacker's moccasins"What's so great about YOUR programming language"? Bob asked Alice. Alice had been here before, she knew that if you are asked that question you should not answer, it's a trap! What Bob's question really meant is "I am OK coasting with the language I already know, you are trying to persuade me to do what seems to be unnecessary work to learn your new-fangled language". Thinking quickly on his feet he came up with this trick question, which really means "in 30 seconds or less convince me that the language is superior to the one I already know or perfect for my needs". As with any nuanced argument, the case for a particular language cannot really be made in a pithy sentence that has high sound-bite value. In life there are pros and cons for any course of action.<br />
<br />
Bob had succumbed to <a href="http://en.wikipedia.org/wiki/Confirmation_bias">confirmation bias</a>, for whatever reason (I would guess laziness) he had already decided that he was not going to learn the language. What he was really looking for was an excuse. So he posed a question of the form "give me the one killer reason to do it", since there is no ONE magic reason, Alice would fail to provide it and he could live on blissfully and effortlessly too! Alice did not take the bait though. Instead she offered to teach Bob the basics of the language, little by little through progressively more interesting examples. She followed through on her offer and bit by bit time Bob began to see where her passion for the language stemmed from. At the end of it he was not quite ready to jump ship but he felt enriched by the experience he had a great time and learned a new language in the process.<br />
<br />
You can substitute my name for Bob, (though indirectly) <a href="http://en.wikipedia.org/wiki/Harold_Abelson">Hal Abelson</a> and <a href="http://en.wikipedia.org/wiki/Gerald_Jay_Sussman">Gerry Sussman</a> for Alice and Lisp is the unnamed language in the little story above. For long time and for no reason that I can think of other than that the nested braces where a little hard to read I had long resisted learning <a href="http://en.wikipedia.org/wiki/Lisp_programming_language">Lisp</a> despite much cajoling from one or two friends. I had my little reasons like <a href="http://en.wikipedia.org/wiki/Polish_notation">Polish notation</a> arithmetic was hard to read and a host of others. Then one day I came across Abelson and Sussman's <a href="http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/">recordings</a> from 1986 of the MIT course Structure and Interpretation of Computer Programs (SICP). That chance happening changed my view of Lisp completely in less than two weeks. SICP was taught in <a href="http://en.wikipedia.org/wiki/Scheme_%28programming_language%29">Scheme</a> a dialect of Lisp, it took a few attempts but I eventually got into it, watched the videos attentively and was rewarded handsomely.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEUjYTztHjLXZjFlRvCrJ0Nlma4CnUT0xIN4lquVUZehF828jVMVVF7sv1U1eI3plwQajA8PC2jBG7XhIsvgJcqSJ6J_2D0bZa0yveeeuv5AILDsBQQVPJjkLxdWlaYCCx1ZFL/s1600/P6290011.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEUjYTztHjLXZjFlRvCrJ0Nlma4CnUT0xIN4lquVUZehF828jVMVVF7sv1U1eI3plwQajA8PC2jBG7XhIsvgJcqSJ6J_2D0bZa0yveeeuv5AILDsBQQVPJjkLxdWlaYCCx1ZFL/s320/P6290011.JPG" /></a></div>There are 10 lectures and by the end of the 5th one, having written with ridiculously little effort a host of interesting programs and in the process creating both an embedded an interpreted <a href="http://en.wikipedia.org/wiki/Domain-specific_language">Domain Specific Language</a>, I was a changed man! I had seen the light, I finally understood the ravings which just a fortnight earlier were incomprehensible. My eyes no longer blind to the light I realised that similar derisions to those made against Lisp can and have been made against other languages like say Python<a href="#braces"><sup>1</sup></a> of which I am a great fan. So I whole heartedly encourage you watch the lectures or read the <a href="http://mitpress.mit.edu/sicp/full-text/book/book.html">book</a> which is available free on-line. After the first few chapters you may not be rushing to write your next web application in Lisp but I guarantee you will have a much better appreciation of the virtues of Lisp. The Native American prayer really rings true here: Grant that I may not criticize my neighbour until I have walked a mile in his moccasins. What's more with Lisp you need not even walk the full mile, a few hundred yards will do.<br />
<br />
<br />
<span style="font-size: x-small;"><a href="" name="braces">1.</a> No curly braces? You rely on indentation to indicate block structure? That is crazy talk!</span>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-78247137625645057312010-06-13T12:16:00.000-07:002010-08-10T05:24:09.194-07:00Trapped on a local maximumA few months ago my laptop died and after several futile attempts to resurrect it<a href="#max"><sup>1</sup></a> I finally let it go. So I purchased a new laptop, restored my data from the old one and proceeded to get it set up just the way I like it. This was going to be a long but enjoyable process. Finally though the <a href="http://en.wiktionary.org/wiki/yak_shaving">Yak Shaving</a> had to come to an end I had a project to get working on. It was a web project and I was going to use my de-facto choice, Python and <a href="http://turbogears.org/">TurboGears</a>, but then I thought maybe I should reconsider my tool-kit. I never really considered using a language other than Python but on the web framework choice there was room to manoeuvre, or so I thought.<br />
<br />
I was in a hurry, I had a project to get started on and the laptop saga had set me back significantly. So I decided to take a look at what many would consider the market leader in Python web frameworks: <a href="http://www.djangoproject.com/">Django</a>. No sooner than I had started going through the tutorial I was longing for TurboGears. I told myself that it might be worth it, the Django project seemed more active, the documentation significantly more complete and so on. As time was of the essence and motivation to learn something new lacking, I started my long overdue project using TurboGears and I was as happy as a Duck in water.<br />
<br />
My reluctance to even take the time to learn another web framework got me thinking, what is it about TurboGears that I like so much? Sure I like the extra power <a href="http://www.sqlalchemy.org/">SQLAlchemy</a> brings to the party but other than that, in terms of fitness for purpose these web frameworks are pretty comparable. I came to the conclusion that TurboGears was just comfortingly familiar to me, not in a deep meaningful way, but rather in the most superficial way imaginable.<br />
<br />
My programming experience until a few years ago was mainly with the the C family of languages with the majority of my professional programming life spent using Java and Java Enterprise Edition. When I thought about things in that context I realised I just wanted to stay true to the <a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html">Java annotation</a> and XML values instilled in me from my Java and JEE heritage. I just like the way TurboGears code looks, the <span style="font-family: "Courier New",Courier,monospace;">@expose</span> decorators remind me of Java annotations and the XML based templating engine reminds me of well... all those XML documents you have to create in a JEE application.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjozq9wN6ey9iQ7ZwoCc6tZ_KxpQ4SW-L-dRtbhlT8a7ZyHrmfKiPLW27jKZ51VNBgnf6X9vW7pvk9SD_s5_hG9Oxw2k-kpZCDgcz9yAc2GRGazwtehciINxyAKSte9Lrcpr1k3/s1600/600px-Extrema_example_original.svg.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjozq9wN6ey9iQ7ZwoCc6tZ_KxpQ4SW-L-dRtbhlT8a7ZyHrmfKiPLW27jKZ51VNBgnf6X9vW7pvk9SD_s5_hG9Oxw2k-kpZCDgcz9yAc2GRGazwtehciINxyAKSte9Lrcpr1k3/s200/600px-Extrema_example_original.svg.png" width="200" /></a>When I started using Python and TurboGears I think I subconsciously gravitated to what looked familiar. So even though I had taken the plunge and started using a dynamically typed language, perhaps I was trapped on a local maximum! Looking back over my code I was relieved to find that this is not the case. I write Python code in Python not <a href="http://dirtsimple.org/2004/12/python-is-not-java.html">Java code using Python syntax</a>. It is funny though that I still and probably always will find <span style="font-family: "Courier New",Courier,monospace;">@</span> symbols and angled brackets beautiful.<br />
<br />
<span style="font-size: small;"><b>Update: August 2010</b></span><br />
<span style="font-size: x-small;"><span style="font-size: small;">The internet allows us to collaborate with and befriend people in remote places, but I have always been a believer in meeting people face to face when ever possible. A few weeks ago I went to <a href="http://www.python.ie/pyconireland/conference">PyCon Ireland</a> there I attended the </span></span><a href="http://groups.google.com/group/pyconireland/web/pycon-ireland-2010---links-to-slides-videos-source-code-and-more">Introduction to Django</a> tutorial by Michael Twomey, it was a slightly informal walk through the basics of Django and some more advanced and very useful bits and bobs. Since then I have been able to work through the Django tutorial with much more success than before. A little bit of in person hand holding was all it took to get past the inertia that was holding me back.<br />
<span style="font-size: x-small;"> <br />
</span><br />
<span style="font-size: x-small;"> <br />
</span><br />
<span style="font-size: x-small;"><a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7824713762564505731" name="max">1.</a> Including foolishly replacing the motherboard which extended its life by about 6 weeks, instead of spending that €250 on maxing out a replacement.</span>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-70423811523416304232010-05-30T12:10:00.000-07:002010-06-15T14:09:44.826-07:00Languages are magical!I love programming and though I am loathed to admit it, I also love my chosen programming languages. Like many programmers I act like there is "one true path", the one true path is of course Python! Many a writer has been down this road before, yet I am still compelled to do the same. Why? Because I noticed something about myself that both surprised and disappointed me, I get angry when I hear someone bad mouthing Python.<br />
<br />
I would like to think that I am above all that, that I and all those who are truly enlightened have long since moved past Vi versus Emacs, Perl versus Python, Dynamic versus Static typing and dare I say it even Windows versus Linux. I am wise therefore I know that these things all have different reasons for being and different places in history, thus a direct comparison of their merits and demerits is a fool's errand. Yet even here in the programming ivory tower, things are not so simple.<br />
<br />
If I were truly enlightened I would start every new project<sup><a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7042381152341630423#project">1</a></sup> with an evaluation of the best tools to use, one of the most important being the programming language. The primary criteria for selection if I am being completely rational should be fitness for purpose. However it is almost inconceivable that unless I have no choice in the matter<sup><a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7042381152341630423#existing">2</a></sup> that I would use anything other than Python. There are of course cases where this would be completely insane. When I am tinkering with the <a href="http://www.arduino.cc/">Arduino</a> I use Processing, a great language it's own right, other than that I default to Python.<br />
<br />
Much ink has been spilt addressing this issue directly, but I got more clarity from writers that were addressing orthogonal and indeed probably more important issues than the programming language wars.<a href="http://en.wikipedia.org/wiki/Eben_Moglen"> Eben Moglen</a> the brilliant lawyer/historian/activist and once programming language designer said when Graphical User Interfaces were first becoming popular he did not perceive this as a good thing. In his opinion the key issue in computing was how we communicate with computers and each other, therefore language is where he thought at the time the focus should have been. In the context of Artificial Intelligence Terry Winograd and Fernando Flores in their book: <a href="http://portal.acm.org/citation.cfm?id=5245"><i>Understanding Computers and Cognition -- A New Foundation for Design</i></a> placed similar importance on language when create what became known as the <i><a href="http://en.wikipedia.org/wiki/Language/action_perspective">Language/Action Perspective</a></i>. They said: "our position therefore in accordance with the preceding chapters is that computers cannot understand language"<sup><a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7042381152341630423#paper">3</a></sup>. Concluding that since we cannot get computers to understand language: "software is unlikely to ever exhibit intelligent behaviour". These statements purportedly caused the nuclear winter in AI, but I digress.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnNuFloYjQmro4chJiAfeCQH5Un2IJt40noxUv1dXOdjGCV3aEQ7HpPTba3WZ61owEAw0OoYo4X0gK-5s9ZNcpAE_Y5w-Gi5nkJNIn06wOPwTNW4YP-0xfSK4bx_7mGSv-9pfy/s1600/extra+151.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnNuFloYjQmro4chJiAfeCQH5Un2IJt40noxUv1dXOdjGCV3aEQ7HpPTba3WZ61owEAw0OoYo4X0gK-5s9ZNcpAE_Y5w-Gi5nkJNIn06wOPwTNW4YP-0xfSK4bx_7mGSv-9pfy/s320/extra+151.jpg" /></a></div>What I take from all of this is that language is really powerful, powerful to the extent of appearing magical. Since it is magic, once you know one kind of magic, like the queen of <a href="http://en.wikipedia.org/wiki/Narnia_%28world%29">Narnia</a> it is inconceivable to us that there may be a deeper magic, of which we are not yet aware. So why do we obsess about our programming languages? Simple, because languages are magical!<br />
<br />
<span style="font-size: small;"><br />
</span><br />
<span style="font-size: x-small;">Footnotes:</span><br />
<br />
<span style="font-size: x-small;"><a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7042381152341630423" name="project">1.</a>Ok maybe not every new project, it would probably not be a good idea to write three web applications in succession with different tool-sets.</span><br />
<br />
<span style="font-size: x-small;"><a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7042381152341630423" name="existing">2.</a>For example if I join an existing project already using certain tools.</span><br />
<br />
<span style="font-size: x-small;"><a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7042381152341630423" name="paper">3.</a>The original paper is from mid-1980's, in the fullness of time they may be proven wrong but that is what they said at the time.</span>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.comtag:blogger.com,1999:blog-10127502.post-73693953353331677542010-05-16T10:30:00.000-07:002010-06-15T14:10:28.508-07:00Why is it hard to recognise crappy software?A few years ago I had a commute to work that took over an hour and involved a couple of different modes of transport. I had a very short walk to the Luas<a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7369395335333167754#luas"><sup>1</sup></a> which took me to the City Centre. Once there I had a fifteen minute walk to catch a private bus service that ran and still runs I assume between the City Centre and a business park in the middle of no where. For some reason I always seem to end up working in difficult to get places.<br />
<br />
Most of the time this was not too bad, a twenty five minute tram ride followed by a fifteen minute walk then a twenty five minute bus ride and I was there. This was not as bad as it sounds and it gave me one and half hours a day to myself. I got though a lot of reading those days and sometimes I even miss it a little, then I come to my senses! You see the, "just over an hour journey" was the ideal scenario, all too often the private bus was very late or did not show up at all. We were often left waiting there and when we called the bus company's office we got the standard line "he is just around the corner". Which was funny as the bus stop was close to a junction and we could see pretty much around every corner.<br />
<br />
Forced to stand together for protracted periods of time and united by our common hatred of the bus company, strangers start to talk to strangers, strangers who over time (years in my case) become bus friends, then real friends and sometimes even good friends. It was on that bus that I met a friend of mine, who a few years later hired me for a great job and became my boss, so it wasn't all for naught. He loved and still loves a good metaphor, don't we all?<br />
<br />
One my favourite metaphors he came up with<a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7369395335333167754#with"><sup>2</sup></a> was to do with why it is hard to recognise bad software until it is too late. One day on the bus ride home (the bus was on time that day, saints be praised) we were discussing why it is hard for consumers and businesses alike to recognise crappy software. We were not breaking any new ground we were just having one of those discussions that programmers like to have. We talked about complexity of course, about user eduction and so on and so on. When we were came to how the inner workings of software are mostly hidden<a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7369395335333167754#hidden"><sup>3</sup></a> and how it is different in other fields he said this: "Anyone can make a table by taking a piece of ply-wood and hammering in some 2x4s for legs, but everyone can tell the difference between that table and a table made by a skilled carpenter".<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxqVfWBDfwajr443qRulDYiDGqQM4zacXMhRjFXSPo9khuQ0QlDCSQfFAMJLxqern8y2BEv-4_SwkvAj5eGbGvgmVJe4OzUqCb3uNYgxCL1QTrLjWbR7LJIlO3rxo74z9UT6c/s1600/PC240017.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5469708308809076610" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIxqVfWBDfwajr443qRulDYiDGqQM4zacXMhRjFXSPo9khuQ0QlDCSQfFAMJLxqern8y2BEv-4_SwkvAj5eGbGvgmVJe4OzUqCb3uNYgxCL1QTrLjWbR7LJIlO3rxo74z9UT6c/s320/PC240017.JPG" style="cursor: pointer; float: right; height: 240px; margin: 0pt 0pt 10px 10px; width: 320px;" /></a>The problem with software is that at first glance there can be no difference between the two tables and with a good coat of paint it can be near impossible to tell the difference until you take the table home arrange a fancy dinner party and make a terrible mess!<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: 85%;">Footnotes:<br />
<br />
<a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7369395335333167754" name="luas">1.</a>For those of you that do not live in Dublin, "Luas" is "Fast" in Irish, it is a street going tram that is really handy if you happen to live on one of the only two lines.<br />
<br />
<a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7369395335333167754" name="with">2.</a>I am not saying he was the first to make this analogy, but I first heard it from him.<br />
<br />
<a href="http://www.blogger.com/post-edit.g?blogID=10127502&postID=7369395335333167754" name="hidden">3.</a>In closed source software at least and even open source software to the average non-programmer computer user.</span>Tendayihttp://www.blogger.com/profile/18433213047455866125noreply@blogger.com