<?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'><id>tag:blogger.com,1999:blog-7497898</id><updated>2009-11-16T10:35:58.082-08:00</updated><title type='text'>Amanzi</title><subtitle type='html'>Blog for some things Amanzi</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default?start-index=26&amp;max-results=25'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7497898.post-2269058300489737739</id><published>2009-10-29T04:09:00.000-07:00</published><updated>2009-10-29T05:01:20.769-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='images scanner scan crop whitespace commandline linux ubuntu'/><title type='text'>One liner multi-image cropping</title><content type='html'>A simple entry for a simple way to solve a &lt;span style="font-style: italic;"&gt;common&lt;/span&gt; problem.&lt;br /&gt;&lt;br /&gt;I often have a lot of scanned images, documents usually, that have unnecessary white-space, and other artifacts around the edges due to limitations in the scanner software or issues with the scanner itself. Normally I use &lt;span style="font-style: italic;"&gt;the gimp&lt;/span&gt;, and can correct orientation problems, colour issues and cropping very easily. But this is too much mouse work in my opinion when you have 50 images and all need a similar simple cropping. So I fiddled around in the shell a little and came up with this &lt;i&gt;one-liner&lt;/i&gt;:&lt;br /&gt;&lt;pre style="border: 2px solid rgb(204, 204, 204); padding: 5px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;for file in *.jpg ; do echo "Cropping $file" ; \&lt;br /&gt;convert -trim $file trim/$file ; \&lt;br /&gt;convert -crop 1692x2190+4+4 trim/$file crop/$file ; done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;OK. Not &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; one line, but I swear I did write it on one line :-)&lt;br /&gt;&lt;br /&gt;What it does is three things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;loop over all image files, and for each:&lt;br /&gt;&lt;/li&gt;&lt;li&gt;trim all white-space off the edges, bringing all images to the same basic size with the top left of the real data at the top left of the image&lt;/li&gt;&lt;li&gt;trim them down to a specified size, in this case a little smaller than US letter size. I cut 2 pixels off each edge just to remove some noise commonly found on the edges of scanned images.&lt;/li&gt;&lt;/ul&gt;And here is a simple set of thumbnails of the results:&lt;br /&gt;&lt;p style="margin:0;padding:0;display:block;height:240px;"&gt;&lt;br /&gt;&lt;img style="border: 1px dotted rgb(255, 0, 0); margin: 2px; float: left; cursor: pointer; width: 125px; height: 221px;" src="http://2.bp.blogspot.com/_kg7-gho6F0M/Sul_m39rTvI/AAAAAAAAA9o/KN9Ss2jzCVU/s400/orig56_ss.jpg" alt="" id="BLOGGER_PHOTO_ID_5397985934214647538" border="0" /&gt;&lt;br /&gt;&lt;i&gt;original image with many artifacts&lt;/i&gt;&lt;br /&gt;&lt;img style="border: 1px dotted rgb(255, 0, 0); margin: 2px; float: left; cursor: pointer; width: 108px; height: 177px;" src="http://4.bp.blogspot.com/_kg7-gho6F0M/Sul_ndgjgFI/AAAAAAAAA9w/p7K0g29POjQ/s400/trim56_ss.jpg" alt="" id="BLOGGER_PHOTO_ID_5397985944293048402" border="0" /&gt;&lt;br /&gt;&lt;i&gt;first trim removes continuous whitespace&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin:0;padding:0;display:block;height:150px;"&gt;&lt;br /&gt;&lt;img style="border: 1px dotted rgb(255, 0, 0); margin: 2px; float: left; cursor: pointer; width: 106px; height: 137px;" src="http://4.bp.blogspot.com/_kg7-gho6F0M/Sul_nWWDMFI/AAAAAAAAA94/kiC4csnds50/s400/crop56_ss.jpg" alt="" id="BLOGGER_PHOTO_ID_5397985942369939538" border="0" /&gt;&lt;br /&gt;&lt;i&gt;final cropped image at letter size with edges removed&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;It took about 10 minutes to figure out this script, 20 seconds to run it on all 50 images, and then 20 minutes to write the blog!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-2269058300489737739?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/2269058300489737739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=2269058300489737739' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2269058300489737739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2269058300489737739'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/10/one-liner-multi-image-cropping.html' title='One liner multi-image cropping'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kg7-gho6F0M/Sul_m39rTvI/AAAAAAAAA9o/KN9Ss2jzCVU/s72-c/orig56_ss.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-1906615333587659877</id><published>2009-10-15T02:14:00.001-07:00</published><updated>2009-10-16T05:30:39.395-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile efficiency complexity motivation rewards motivators rowe'/><title type='text'>Complexity threshold</title><content type='html'>I've been planning to write a proper article about this for years, but inspired today by &lt;a href="http://www.ted.com/speakers/daniel_pink.html"&gt;Dan Pink&lt;/a&gt;'s excellent presentation on the &lt;a href="http://www.ted.com/talks/dan_pink_on_motivation.html"&gt;surprising science of motivation&lt;/a&gt;, I thought I'd write a mini-version of this, as an introduction and a reminder to myself to write the real one.&lt;br /&gt;&lt;br /&gt;Back in 2006 I wrote a blog titled '&lt;a href="http://amanzi.blogspot.com/2006/03/perception-of-control.html"&gt;The perception of control&lt;/a&gt;', dealing with &lt;span style="font-style: italic;"&gt;uninformed decision making&lt;/span&gt; and the &lt;span style="font-style: italic;"&gt;illusion of efficiency&lt;/span&gt;, commonly found in control-based companies. &lt;a href="http://www.allankelly.net/"&gt;Allan Kelly&lt;/a&gt; gave a detailed and informative response, including the statement "The fundamental problem facing developers is &lt;b&gt;Complexity&lt;/b&gt;.  Attempting reuse simply increases complexity."&lt;br /&gt;&lt;br /&gt;This got me thinking, and I remembered a long series of interesting experiences I had regarding attempts to scale up development teams, and the very mixed results I got. These days most people know about '&lt;a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month"&gt;The Mythical Man-Month&lt;/a&gt;', but I had experienced many occasions where I needed to argue this point with people that did not. I'm embarrassed to say I was one such person for a while, and needed to learn the hard way myself. One advantage of learning the hard way is that you are forced to try to explain what happened, to yourself and others. So I though about it, and noticed a number of interesting correlations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Adding people to projects works to some extent for very small teams, but can quickly get out of hand. It seems as if a threshold is crossed after which the project becomes a death march.&lt;/li&gt;&lt;li&gt;Assigning tasks of varying levels of complexity to a specific developer has a remarkably similar threshold. Their performance is consistent until they pass some level of complexity, after which the task goes _pear shaped_.&lt;/li&gt;&lt;li&gt;New developers on old code can perform well if the code is relatively simple, and perform extremely badly if it is not. Most critically, code that is twice as complex does not half the performance. The effects can be much worse. Again there seems to be a threshold.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;How do we find, measure or manage this threshold? It is not simple, but there are a few factors to look at to help us analyse the situation. These involve the characteristics of the developer, the team and the project:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Each developer has their own threshold, after which the complexity becomes hard to manage. Obviously this threshold is not fixed, and depends on many factors, including their state of mind. &lt;a href="http://www.ted.com/talks/dan_pink_on_motivation.html"&gt;Dan Pink's presentation&lt;/a&gt; demonstrates an interesting effect where increasing motivation decreases performance for creative tasks. He says increased focus can decrease problem solving skills. I agree, and see a correlation, since decreased problem solving skills means the developer will have a much lower _complexity threshold_.&lt;/li&gt;&lt;li&gt;The team has a threshold, very strongly correlated to the level of communication in the team, and most of the &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile software development&lt;/a&gt; approaches have a lot to say about how to deal with this problem. Usually they try to increase communication and couple that to catching problems early.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The project can obviously range from simple to very complex. Many approaches to dealing with this complexity are to split the project into modules and build teams on each, but in many cases this merely replaces one type of complexity with another. The more modern solutions to this involve prototyping, re-factoring, TDD and BDD.&lt;/li&gt;&lt;/ul&gt;In projects that I manage, I believe we need to deal with all three areas. However, I have a personal bias towards focusing on the first, largely because I'm particularly interested in individual behaviours. I think this helps me also deal with the second issue, because if you have a feeling for the individuals, you can use that to help improve communication in the team. On the third point, I have a solid track record of prototyping and refactoring. I am also a believer in TDD and BDD, but must confess I can do with some improvement in those areas.&lt;br /&gt;&lt;br /&gt;Since this blog is merely an introduction to this idea, I will end off with a short piece on how I think we can help individuals keep on the _good side_ of their personal complexity thresholds. I have normally focused on two approaches, but Dan Pink has shown me a really nice new take on this. Let's start with my classic view:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Identify the threshold and avoid it. Ok, this sounds like a cop-out, but what I'm talking about is assigning tasks to team members based on their natural skills, and so reducing the risk of crossing the threshold. Of course, one of the best ways to do this is to get the developers to pick the tasks themselves, as common in several Agile approaches, like &lt;a href="http://en.wikipedia.org/wiki/Scrum_%28development%29"&gt;Scrum&lt;/a&gt;. This is a good start, but does not always work, because while some developers pick the easy tasks and perform well, others are suckers for a challenge. So sometimes you need to advise them. An external opinion can make all the difference. If you are the developer yourself, learning to identify when you're in trouble is a valuable skill, but you will also get help to do so in an Agile team, especially if you use pair programming.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Adjust the developers threshold. Ok, this one sounds hard. Not really, when you realize that this might be as simple as additional training. But one area that really matters is helping the developers identify the thresholds themselves and respond to them. It can be very hard, when stuck in a complex problem, to see outside the box. Again, working in an agile team really helps here. Getting a second opinion on something, even if you might not realize you need it, can make all the difference.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Dan Pink's presentation really builds on this second option. Instead of trying to improve performance with classic rewards, like bonuses, we focus instead on &lt;span style="font-weight: bold; font-style: italic;"&gt;intrinsic motivators&lt;/span&gt;. Dan describes three:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Autonony&lt;/span&gt; - the freedom to define your own life. In my world that can mean something as simple as allowing the developers to pick their own tasks. I also see this respecting their opinions in design meetings. In fact anything that tries to break the control-based management I described in '&lt;a href="http://amanzi.blogspot.com/2006/03/perception-of-control.html"&gt;the perception of control&lt;/a&gt;' is a good start.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Mastery&lt;/span&gt; - the desire to get better and better. Obviously this can mean training, but coupled to the first point it can mean the option to develop ones career in the direction that one has a passion for. For more on the use of the word 'passion' in this context, I advise reading '&lt;strong style="font-weight: normal;"&gt;&lt;a href="http://www.amazon.ca/Hacker-Ethic-Spirit-Information-Age/dp/0375505660"&gt;The  Hacker Ethic and the Spirit of the Information Age&lt;/a&gt;'.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Purpose&lt;/span&gt; - the yearning to do what we do in the service of something larger than ourselves. Ok, being a fan of open source, this sounds great. Of course it is both more subtle and more applicable than that. People want to do something good, or something of note. In a software project this can be as simple as assigning key features to developers. Someone constantly getting the boring stuff is bound to perform worse.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I found Dan's presentation very interesting. But is this really related to the problem of complexity? I believe it is. If low performance can be attributed to crossing the complexity barrier, then these techniques can be used to move that barrier.&lt;br /&gt;&lt;br /&gt;Dan finishes with a introduction to &lt;a href="http://en.wikipedia.org/wiki/ROWE"&gt;ROWE&lt;/a&gt; - the 'results only work environment'. I've been playing with a few ideas in this area, and I'd love to report on them, but need to do that in another blog :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-1906615333587659877?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/1906615333587659877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=1906615333587659877' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/1906615333587659877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/1906615333587659877'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/10/complexity-threshold.html' title='Complexity threshold'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-8684654450019924987</id><published>2009-07-31T08:00:00.000-07:00</published><updated>2009-08-02T12:28:57.922-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby groovy python perl boolean zero empty false'/><title type='text'>Boolean behaviour</title><content type='html'>I recently spent a good half hour debugging some grails unit test code, only to track the problem down to groovy's boolean behaviour. As a Ruby programmer I've become spoiled by the clean and simple predictability of Ruby booleans, and since groovy is visually so very 'Ruby'esque' I was only too easily deceived.&lt;br /&gt;&lt;br /&gt;So, I've made a little summary of different programming languages boolean behaviour. IMHO There are only two modern languages with simple boolean Rules, Ruby and Java, and the rest are unreasonably complex:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Java - no coercion, only Boolean/true/false are valid&lt;/li&gt;&lt;li&gt;Ruby - no coercion, only nil and false are false, all else is true&lt;/li&gt;&lt;li&gt;Python - no coercion, a ton of rules for deciding what is true/false&lt;/li&gt;&lt;li&gt;Groovy - coercion to true/false, with a ton of rules for deciding which way to go&lt;/li&gt;&lt;li&gt;Perl - no coercion, a ton of rules for deciding what is true/false&lt;/li&gt;&lt;li&gt;C - no coercion, 0 is false, all else is true&lt;/li&gt;&lt;/ul&gt;What a mess! Every single one is different. But this is my opinion, I judge these on the basis of a few criteria:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Simple rules, in which case Java, Ruby and C rank high&lt;/li&gt;&lt;li&gt;Simple syntax, in which Ruby and C rank high&lt;/li&gt;&lt;li&gt;Enables expressive code, in which Ruby ranks high, and Python, Groovy and Perl do quite well (and Java does very badly)&lt;/li&gt;&lt;/ul&gt;OK, you guessed it, I'm a Ruby fan. But let me justify my opinion with one simple meaningful example. I'll show a series of statements that do the same thing:&lt;br /&gt;&lt;pre style="border: 1px dotted rgb(85, 85, 85); margin: 10px; padding: 5px; background: rgb(238, 238, 238) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;a = (a == nil) ? 'default' : a&lt;br /&gt;a = a || 'default'&lt;br /&gt;a ||= 'default'&lt;br /&gt;&lt;/pre&gt;AFAIK, this is possible as a direct result of the simple boolean logic, and in particular the fact that everything is true except false and nil.&lt;br /&gt;&lt;br /&gt;The groovy book I read claims similar behaviour, but it in fact is not true. The book claimed the following equivalent statements:&lt;br /&gt;&lt;pre style="border: 1px dotted rgb(85, 85, 85); margin: 10px; padding: 5px; background: rgb(238, 238, 238) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;a = (a == null) ? 'default' : a&lt;br /&gt;a = a ?: 'default'&lt;br /&gt;&lt;/pre&gt;And if you have a=nil (a=null in Groovy) both the Ruby and Groovy code behave the same. But just try pass in a='' (empty string), or a=0. Ruby will keep the assignment passed in, while Groovy will re-assign to 'default', not what you expected, and not what the Groovy book claimed.&lt;br /&gt;&lt;br /&gt;The problem here is that Groovy, Perl and apparently Python, decided to try make developers lives easier with some convenience rules for booleans, notably that integer 0, empty strings and empty collections are all seen as false. And honestly, there are many scenarios that is useful, and I've used that fact for years in Perl. And when I first started Ruby coding, I balked at the idea that 0 and '' were true. But it did not take long to see the light. And then I began to remember the pain I had debugging Perl code where the bug was due to an unexpected false when an operation returned a numerical zero or an empty string.&lt;br /&gt;&lt;br /&gt;Sorry, I'm convinced. Ruby got it right!&lt;br /&gt;&lt;br /&gt;And the remaining question is: since Groovy clearly copied a lot of Ruby syntax, why did they not do it the Ruby way with booleans? Actually I think the answer is obvious once you think about it. Groovy is actually Java inside. Groovy tries to bring nice modern dynamic scripting capabilities to the Java language. Quite a paradox that Java, with the most rigid, predictable boolean behaviour, and the easiest debugging of the lot, should end up with this kind of scripted boolean. What I believe happened is that Groovy decided, quite naturally, to go with the coercion approach to scripting Java. Deep down it is all Java with strict types and strict booleans, but in between Groovy is coercing and converting all types automatically. This approach has been used all over the place.&lt;br /&gt;&lt;br /&gt;And once you're on the coercion band-wagon, I think the end result is exactly what Groovy has.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-8684654450019924987?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/8684654450019924987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=8684654450019924987' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/8684654450019924987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/8684654450019924987'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/07/boolean-behaviour.html' title='Boolean behaviour'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-4277380527040734470</id><published>2009-06-08T07:46:00.000-07:00</published><updated>2009-06-08T08:05:27.791-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recruitment opensource open source foie gras training efficiency'/><title type='text'>Recruitment a'la open source</title><content type='html'>I just read &lt;a href="http://allankelly.blogspot.com/2009/06/time-to-end-foie-gras-recruitment.html"&gt;Allan Kelly's blog criticising 'Foie Gras recruitment'&lt;/a&gt;. Allan's point is that adding developers too quickly has the opposite effect than intended, slowing down a project. In fact, recruiting always slows things down before it speeds things up, due to the cost of training up and familiarizing developers with the company processes, product vision and code.&lt;br /&gt;&lt;br /&gt;However, there are many factors that affect this, and influence the severity of the problem as well as the teams ability to deal with the problem. Allan mentions one, the teams processes and practices. However, another really important one is the character of the developers involved, especially the new ones.&lt;br /&gt;&lt;br /&gt;Imagine the hypothetical case where you magically recruit only developers that are actually capable of such a high level of self training that the negative impact on the team is much less than average (obviously never zero). Imagine also that the answers to the questions are usually available without another team member having to spend time. For example, the answers lie in the code itself, and any associated well written documentation, including feature specification, project goals, etc.&lt;br /&gt;&lt;br /&gt;Obviously this is a hypothetical scenario essentially never achieved in corporate development, but it does exist in the real world, in many open source projects. Often people enter open source projects because they did their own self-training, read the code, tried things out and made working contributions that were good enough to get the attention of the project owners, and as a result received admittance to the team. This scales much better, and faster, than normal recruitment. So why does this not happen in the corporate development world? Usually because it relies on statistical factors no often achieved, related to the percentage of available developers of sufficient and appropriate skills, also sufficiently interested in the project to put in the time. This is a low number, especially when you consider that by the term 'interested' I also imply that the developer is able to make a living from this activity.&lt;br /&gt;&lt;br /&gt;So how do corporate development projects benefit from this? Or can they? The problem being that corporate projects are, almost by definition, not interesting enough to the potential developers.&lt;br /&gt;&lt;br /&gt;Personally I believe it is possible to find a middle ground, if you close the gap from both ends:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;move the project goals closer to the developers goals (make the project much more interesting to open source developers, make it open source, make it do things more interesting to a wider audience)&lt;/li&gt;&lt;li&gt;move the developers goals closer towards the projects goals (ie. pay the developers)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Obviously the second option should not be undertaken using normal recruitment. You still need to use open source recruitment (statistical filtering as described above).&lt;br /&gt;&lt;br /&gt;Is this really hypothetical? No, I've actually been putting this into practice with my most recent recruitment drive. I recruited three new remote developers without reading a single CV or holding a single interview. Instead I simulated the open source approach by using the following steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;require a code contribution, which was evaluated (testing not only coding skills, but ability to read specs, work remotely, solve problems independently, do internet research, and perform self-training)&lt;/li&gt;&lt;li&gt;contract for a trial period, testing their ability to perform with other remote developers, double checking their skills, notably an increasing understanding of the project itself&lt;br /&gt;&lt;/li&gt;&lt;li&gt;contract for longer periods with tighter integration into the team&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Now three months down the line, I have actually seen quite decent productivity. I count the approach a success, and I'll be sure to use the same technique for most future recruitment drives.&lt;br /&gt;&lt;br /&gt;One final point. This approach does not solve the &lt;a href="http://allankelly.blogspot.com/2009/06/time-to-end-foie-gras-recruitment.html"&gt;problems identified by Allan Kelly&lt;/a&gt;. It only serves to reduce their impact. And it does introduce another set of problems related to efficient project management of loosely coupled remote teams. That is a subject for separate blog :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-4277380527040734470?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/4277380527040734470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=4277380527040734470' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4277380527040734470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4277380527040734470'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/06/recruitment-ala-open-source.html' title='Recruitment a&apos;la open source'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-2811340400042534542</id><published>2009-05-25T08:16:00.000-07:00</published><updated>2009-05-25T08:44:22.427-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google economics googlenomics search auction adwords adsense asimov psychohistory'/><title type='text'>The Secret of Googlenomics</title><content type='html'>I just read an amazing and insightful article in wired about the '&lt;a href="http://www.wired.com/culture/culturereviews/magazine/17-06/nep_googlenomics?currentPage=all"&gt;Secret of googlenomics&lt;/a&gt;', which was an riveting introduction to the auction based principles that have become the core of almost everything at google. And even more importantly represent a possible future for many other modern elements of the future economy.&lt;br /&gt;&lt;br /&gt;Most of the article references a presentation given by google's chief economist, Hal Varian, who's career was inspired by Isaac Asimov's books &lt;a href="http://en.wikipedia.org/wiki/Foundation_series"&gt;The Foundation Series&lt;/a&gt;: "&lt;span style="color: rgb(0, 0, 153);"&gt;In Isaac Asimov's first &lt;/span&gt;&lt;em style="color: rgb(0, 0, 153);"&gt;Foundation Trilogy&lt;/em&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;, there was a character who basically constructed mathematical models of society, and I thought this was a really exciting idea. When I went to college, I looked around for that subject. It turned out to be economics.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;I was also inspired by Asimov's theory of '&lt;a href="http://en.wikipedia.org/wiki/Psychohistory_%28fictional%29"&gt;psychohistory&lt;/a&gt;' when I read those books back in the early 90's, but unlike Hal, I thought the idea was entirely impossible, and so I stuck with reality and studied pure science. Perhaps I was wrong, as google's mathematicians now do take into account everything from the weather to peoples fashions and buying habits, to predict the best adverts to use on search results.&lt;br /&gt;&lt;br /&gt;I strongly recommend reading the entire article at &lt;a href="http://www.wired.com/culture/culturereviews/magazine/17-06/nep_googlenomics"&gt;http://www.wired.com/culture/culturereviews/magazine/17-06/nep_googlenomics&lt;/a&gt;. For a taster, here is the concluding paragraph:&lt;br /&gt;&lt;p style="color: rgb(0, 0, 153); padding-left: 25px;"&gt;There's a wild contrast between this sparsely furnished residence and what it has spawned—dozens of millionaire geeks, billions of auctions, and new ground rules for businesses in a data-driven society that is far weirder than the one Asimov envisioned nearly 60 years ago. What could be more baffling than a capitalist corporation that gives away its best services, doesn't set the prices for the ads that support it, and turns away customers because their ads don't measure up to its complex formulas? Varian, of course, knows that his employer's success is not the result of inspired craziness but of an early recognition that the Internet rewards fanatical focus on scale, speed, data analysis, and customer satisfaction. (A bit of auction theory doesn't hurt, either.) Today we have a name for those rules: Googlenomics. Learn them, or pay the price.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-2811340400042534542?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/2811340400042534542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=2811340400042534542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2811340400042534542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2811340400042534542'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/05/secret-of-googlenomics.html' title='The Secret of Googlenomics'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-2048852174069972413</id><published>2009-05-11T08:16:00.000-07:00</published><updated>2009-05-11T08:49:58.473-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artistic engineer dhh scientist programmer creativity'/><title type='text'>Artistic Engineers</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kg7-gho6F0M/SghIYu4gvDI/AAAAAAAAA9I/vtPE89K2npw/s1600-h/artistic_engineers.jpg"&gt;&lt;img style="text-align: center; cursor: pointer; width: 400px; height: 200px;" src="http://1.bp.blogspot.com/_kg7-gho6F0M/SghIYu4gvDI/AAAAAAAAA9I/vtPE89K2npw/s400/artistic_engineers.jpg" alt="" id="BLOGGER_PHOTO_ID_5334593348359470130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've always believed that artistic or creative talent was indispensable in technical fields like science, engineering and software development. But I never put together a coherent enough description to warrant a blog post, only the occasional soliloquy over a drink. But now I've just read &lt;a href="http://www.loudthinking.com/about.html"&gt;DHH&lt;/a&gt;'s blog entry "&lt;a href="http://www.loudthinking.com/posts/42-we-need-both-engineers-and-artists-in-programming"&gt;We need both engineers and artists in programming&lt;/a&gt;", and he described it so well, I just had to respond. His description focused on a developers perspective:&lt;br /&gt;&lt;p style="margin-left: 2em; font-style: italic; color: rgb(0, 51, 51);"&gt;People waxing lyrically about beautiful code and its sensibilities. People willing to trade the hard scientific measurements such as memory footprint and runtime speed for something so ephemeral as programmer happiness.&lt;/p&gt;Now I'm originally a pure science researcher. And there is no more extreme case of a &lt;span style="font-style: italic;"&gt;non-artistic&lt;/span&gt; image than that of a scientist. What do most people think: white lab-coats, thick-rimmed glasses, rigorous systematic approach to everything in life and a total lack of&lt;br /&gt;artistic flair.&lt;br /&gt;&lt;br /&gt;And often that image is not entirely inaccurate. As 'Robert Martin' indicated, professionalism is a very important quality for software development (and I add - science and engineering in general). But as DHH asserts: '&lt;span style="font-style: italic; color: rgb(0, 51, 51);"&gt;the wonderful thing about this new age of programming is that we need and prosper from both types of programmers&lt;/span&gt;'.&lt;br /&gt;&lt;br /&gt;I agree with David. You really do need both types. And if you look back at some of the most impressive discoveries in science in the 20th century, there were artistic people involved, usually with the key discovery. I love the biggest deviation from the boring stereotype - Einstein, with his wild hair and almost chaotic appearance.&lt;br /&gt;&lt;br /&gt;It's all about thinking outside the box. David says it's all about 'programmer happiness'. Of course he's right too.&lt;br /&gt;&lt;br /&gt;Now what about the irony that DHH's profile shot is so much more professional looking than Einstein's?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-2048852174069972413?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/2048852174069972413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=2048852174069972413' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2048852174069972413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2048852174069972413'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/05/artistic-engineers.html' title='Artistic Engineers'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kg7-gho6F0M/SghIYu4gvDI/AAAAAAAAA9I/vtPE89K2npw/s72-c/artistic_engineers.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-728209228624495923</id><published>2009-04-20T03:07:00.000-07:00</published><updated>2009-04-20T04:42:46.086-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git svn code scm github control'/><title type='text'>What's the point of github?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kg7-gho6F0M/SexfnBos6yI/AAAAAAAAA9A/RJZzqlmeQzM/s1600-h/dscm.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 218px;" src="http://3.bp.blogspot.com/_kg7-gho6F0M/SexfnBos6yI/AAAAAAAAA9A/RJZzqlmeQzM/s400/dscm.png" alt="" id="BLOGGER_PHOTO_ID_5326737583331142434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;While driving to Malmö last Friday to attend a tech talk on &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; by Sébastian Cevey and hosted by &lt;a href="http://www.purplescout.se/"&gt;PurpleScout&lt;/a&gt;, I was trying to explain distributed source code management systems (like &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt;) to a non-developer friend of mine. I very quickly found myself explaining much more about git than I realized I knew. And I found myself asking, and answering, what I think is a very interesting question: what is the point of github?&lt;br /&gt;&lt;br /&gt;The situation is that git, and other distributed source code management systems, like &lt;a href="http://bazaar-vcs.org/"&gt;bazaar&lt;/a&gt; and &lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;mercurial&lt;/a&gt;, appear to start from the philosophical position of giving complete control to the end user (in this case the developer). They are not centrally controlled systems, there is no central server, no 'little' boss to ask permission from for access to files, branches or projects. When you clone the repository, you get it all, with all history and everything. Power to the people!&lt;br /&gt;&lt;br /&gt;This allows for highly flexible distributed teams, each working in their own way, as suites the developers themselves. It completely solves the usual problem found in central systems like CVS, SVN and, heaven forbid, Perforce: getting permission from a non-developer to do development.&lt;br /&gt;&lt;br /&gt;So then, why does a site like &lt;a href="http://www.github.org/"&gt;www.github.org&lt;/a&gt; exist? It seems to imply adding back a central server to the de-centralized system. With a little thought, I realised what was going on. The problem had never been about central control, it was all about &lt;span style="font-weight: bold; font-style: italic;"&gt;who has the control&lt;/span&gt;, and distributed systems actually do not remove the concept of central control at all. They just facilitate a situation where the &lt;span style="font-weight: bold; font-style: italic;"&gt;right people are in control&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;To explain this, I should re-describe what the original problem was. Consider CVS and SVN, arguably the industry standard(s). You have a central server with the code (and history and branches, etc.). Each user checks out a working copy of a branch of the code. After doing work, they commit back to that branch (dealing with conflicts and merges as needed). This implies a very particular workflow, and forces connectivity to the server for all major actions that require working with the code history (checkout, update, commit, branch, merge, etc.). And the mere existence of the central server implies the existence of IT and admin in the decision making loop, which can only hurt. Perforce, being more susceptible to the influence of IT on purchasing, took this one step further and required connectivity to the central server for almost any development activity, and, can you believe it, even requires developers to unlock each file they plan to work on! Can there be anything worse for developer productivity? Well, yes, anyone remember Microsoft's 'SourceSafe'?&lt;br /&gt;&lt;br /&gt;What was the main problem here? It was not actually the central server, but rather it was a few things implied by this architecture:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The involvement of non-development staff in the smaller details of what the developer actually needs to do, which adds overhead to development activities, which means higher cost and less efficiency.&lt;/li&gt;&lt;li&gt;The implication of a specific workflow in the way the developers need to work with the code-base.&lt;/li&gt;&lt;li&gt;The need for regular or even continuous connectivity, which also has performance, efficiency and cost implications.&lt;/li&gt;&lt;/ul&gt;Distributed systems completely avoid all of this. Each developer has the complete history, and all branches, right there on his computer. They can do absolutely everything they want without asking anyone, and especially not asking people that don't know about software development. Maximum performance!&lt;br /&gt;&lt;br /&gt;But at the end of the day, those developers need to get their code back to somebody in charge. There is always going to be one person or organization that actually sells the product, or distributes the product, or supports it. So, no matter how much power the developer thinks they have, the real world is still centrally controlled. But at least now the control is not micro-management. Now the control is closer to the real business, which is about getting good code to the right customers.  Distributed source code management allows for this to be done most efficiently. The developers have all the power to do their job most efficiently, but with power comes responsibility and those same developer are now required to do all the merging back into the main code. How is this done without a central server? Easy, each developer simply publishes to their own public copy of the latest code-base. That public copy could even be a shared location on their own computer, accessible to the right people. Or, in the case of open source projects, it could be a world readable resource like &lt;a href="http://www.github.org/"&gt;github&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And that's the point of github! It is a convenient place for developers to publish their already merged work, for use by the central product distributor.&lt;br /&gt;&lt;br /&gt;Not only is this a developers dream come true, but it is a software development companies dream come true. You don't have to manage the central server any more. You also don't have to do as much support merging other peoples code into your own, because you can push that responsibility back out to the developers, where it belongs.&lt;br /&gt;&lt;br /&gt;I can't believe this was not done thirty years ago! Why is that? I have two theories:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cobblers children&lt;/span&gt; - since both the customer and supplier are the same (the developer) for code management systems, perhaps it's a case of the cobblers children having the worst shoes. The developers simply work around bad code management systems, because they can.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Corporate control&lt;/span&gt; - if we look back at what I've said about the key differences between central and distributed systems, there seems to be a repeating theme regarding the involvement of non-developers, or company IT processes, in the way the older systems worked.&lt;br /&gt;&lt;br /&gt;Having personally seen a lot of bad decision making by companies to increase their level of '&lt;a href="http://amanzi.blogspot.com/2006_03_01_archive.html"&gt;perception of control&lt;/a&gt;', I'm voting for the latter. (see my blog for more on this).&lt;br /&gt;&lt;br /&gt;But those days are numbered! I think concepts like distributed SCM and open source itself are increasing the prevalence of businesses run on the principles of collaboration instead of control, with decision making by the people with the actual information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-728209228624495923?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/728209228624495923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=728209228624495923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/728209228624495923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/728209228624495923'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/04/whats-point-of-github.html' title='What&apos;s the point of github?'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kg7-gho6F0M/SexfnBos6yI/AAAAAAAAA9A/RJZzqlmeQzM/s72-c/dscm.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-6665004632943097342</id><published>2009-03-20T07:55:00.000-07:00</published><updated>2009-03-20T08:11:32.759-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile phone sms text work crowdsourcing'/><title type='text'>15 million Africans are ready for work - Got Tasks?</title><content type='html'>I followed a twitter comment by Tim O'Reilly that quoted &lt;span class="fn"&gt;Nat Torkington saying &lt;/span&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;"&lt;span style="font-style: italic; font-weight: bold;"&gt;first 5 minutes redlined my awe-ometer&lt;/span&gt;."&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blip.tv/file/1868958"&gt;&lt;img style="cursor: pointer; width: 400px; height: 308px;" src="http://3.bp.blogspot.com/_kg7-gho6F0M/ScOv93YmfgI/AAAAAAAAA84/T6_AZck2azY/s400/GotTasks.png" alt="" id="BLOGGER_PHOTO_ID_5315285462601334274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So I just had to watch &lt;a href="http://blip.tv/file/1868958"&gt;the video he was referring too&lt;/a&gt;, and the above screen-shot is how it ends. I know I spoiled the punch-line, but it's still worth watching so click the link and enjoy!&lt;br /&gt;&lt;br /&gt;The presenter, Nathan Eagle, has started a service in Kenya and East Africa, called TextEagle, which allows mobile phone users to complete small tasks by SMS and get rewarded for it, in airtime or in credit. For a workforce living on $5/day and eager for more airtime, this works like a charm. Tasks include simple text translation services, local news reporting, and even listening to advertising!&lt;br /&gt;&lt;br /&gt;This really is '&lt;a href="http://en.wikipedia.org/wiki/Crowdsourcing"&gt;crowdsourcing&lt;/a&gt;' in action.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-6665004632943097342?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/6665004632943097342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=6665004632943097342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/6665004632943097342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/6665004632943097342'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/03/15-million-africans-are-ready-for-work.html' title='15 million Africans are ready for work - Got Tasks?'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kg7-gho6F0M/ScOv93YmfgI/AAAAAAAAA84/T6_AZck2azY/s72-c/GotTasks.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-3738449662130602461</id><published>2009-03-17T06:52:00.000-07:00</published><updated>2009-03-17T07:43:38.329-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud microsoft computing network sun internet amazon google yahoo facebook ec2 azure'/><title type='text'>'The network is the computer' and 'the client plus the cloud'</title><content type='html'>I just read a very interesting article at computerworld, an &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;taxonomyName=Networking+and+Internet&amp;amp;articleId=9129683&amp;amp;taxonomyId=16"&gt;interview with Craig Mundie&lt;/a&gt; of Microsoft, where he talks about the future of computing, and references some presentations he recently made. The article is titled "&lt;span style="font-style: italic;"&gt;Microsoft's next big thing&lt;/span&gt;", which is a pity because it colours an otherwise interesting read with an overly self-congratulating attitude.&lt;br /&gt;&lt;br /&gt;Craig described the future of computing as being '&lt;span style="font-weight: bold; font-style: italic;"&gt;the client plus the cloud&lt;/span&gt;', which reminded me very strongly of Sun's slogan '&lt;span style="font-weight: bold; font-style: italic;"&gt;the network is the computer&lt;/span&gt;' (originally coined by &lt;a href="http://en.wikipedia.org/wiki/John_Gage"&gt;John Gage&lt;/a&gt;). Jonathan Swartz blogged specifically about '&lt;a href="http://blogs.sun.com/jonathan/entry/the_network_is_the_computer"&gt;the network is the computer&lt;/a&gt;' back in 2006, and gave a nice realistic picture about cloud computing, grids, and how both the average end user and corporate IT environments view and interact with these systems. Sun was, of course, announcing the imminent launch of their own commodity grid, &lt;a href="http://www.network.com/"&gt;www.network.com&lt;/a&gt;. Later that year Amazon launched the public beta of it &lt;a href="http://en.wikipedia.org/wiki/Amazon_EC2"&gt;EC2&lt;/a&gt;, which made a final release in late 2008. While Sun has not yet made the final release of their grid, many others have. It is clear that visionaries from these various companies have been on the right track for quite some time.&lt;br /&gt;&lt;br /&gt;But, as Mr Mundie himself admitted, timing and market readiness are a very important aspect of the adoption of new computing paradigms. And according to him the future paradigm is all about the balance between the client (desktop OS) and the cloud (grids, the internet, etc.) He is absolutely right. And it is easy to be right when you are not predicting the future but observing the present. Aside from Jonathan's 2006 blog, we all know just how successful cloud computing, and commodity clouds like Amazon EC2 in particular, have become. Everyday internet services like google, yahoo, facebook and linkedin are all products of the success of the cloud. We are not about to undergo a paradigm shift, we have been in the transition for some time, and many, many vendors have jumped onto this particular train, including Microsoft, of course, with their '&lt;a href="http://www.microsoft.com/azure/"&gt;Azure&lt;/a&gt;' grid.&lt;br /&gt;&lt;br /&gt;While Mr Mundie may be a little off track about just how important Microsoft is to this new paradigm, one thing I must give him credit for is in making the whole subject much more interesting and enjoyable to read about. In particular his &lt;a href="http://video.computerworld.com/services/link/bcpid1351827287/bctid16633258001"&gt;video presentation&lt;/a&gt; had the 'cool' factor usually associated with a &lt;a href="http://en.wikipedia.org/wiki/Steve_Jobs"&gt;Steve Jobs&lt;/a&gt; presentation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://video.computerworld.com/services/link/bcpid1351827287/bctid16633258001"&gt;&lt;img style="cursor: pointer; width: 400px; height: 298px;" src="http://1.bp.blogspot.com/_kg7-gho6F0M/Sb-1QSoWj3I/AAAAAAAAA8w/Xq_AZp1mcxc/s400/craig_mundie.png" alt="" id="BLOGGER_PHOTO_ID_5314165376804097906" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-3738449662130602461?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/3738449662130602461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=3738449662130602461' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/3738449662130602461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/3738449662130602461'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/03/network-is-computer-and-client-plus.html' title='&apos;The network is the computer&apos; and &apos;the client plus the cloud&apos;'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kg7-gho6F0M/Sb-1QSoWj3I/AAAAAAAAA8w/Xq_AZp1mcxc/s72-c/craig_mundie.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-4376680494846175807</id><published>2009-02-17T07:36:00.000-08:00</published><updated>2009-02-17T07:56:10.747-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='images greyscale imagemagick'/><title type='text'>Convert images to greyscale</title><content type='html'>There are at least a hundred ways of doing this, but I wanted a single-line way to make greyscale versions of a bunch of images on a website I was developing. The last thing I wanted was to load each one in turn into a graphics application to edit the colors.&lt;br /&gt;&lt;br /&gt;ImageMagick to the rescue:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(170, 170, 170); padding: 10px; background: rgb(255, 255, 255) none repeat scroll 0% 50%; overflow: auto; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;for img in *.gif ; do convert $img -colorspace Gray -colors 16 grey_$img ; done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ok - so not really one line, but &lt;em&gt;almost&lt;/em&gt; :-)&lt;br /&gt;&lt;br /&gt;And this is what it looks like afterwards in my file explorer:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kg7-gho6F0M/SZrd3g1n5OI/AAAAAAAAA74/pvGqPDhsOvU/s1600-h/greyscale.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 157px;" src="http://2.bp.blogspot.com/_kg7-gho6F0M/SZrd3g1n5OI/AAAAAAAAA74/pvGqPDhsOvU/s400/greyscale.png" alt="" id="BLOGGER_PHOTO_ID_5303795456959571170" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-4376680494846175807?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/4376680494846175807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=4376680494846175807' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4376680494846175807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4376680494846175807'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2009/02/convert-images-to-greyscale.html' title='Convert images to greyscale'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kg7-gho6F0M/SZrd3g1n5OI/AAAAAAAAA74/pvGqPDhsOvU/s72-c/greyscale.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-4534499431936446076</id><published>2008-09-03T08:14:00.000-07:00</published><updated>2008-09-03T09:01:41.858-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netboot'/><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='grub'/><category scheme='http://www.blogger.com/atom/ns#' term='network install'/><category scheme='http://www.blogger.com/atom/ns#' term='broken cd'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Install or upgrade to ubuntu 8.04 on linux with no media</title><content type='html'>I had a problem, my ubuntu server was too old for automatic updates, and the CD-ROM drive was broken and I'm allergic to floppies. A quick internet search lead to three options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/instlux"&gt;instlux&lt;/a&gt;, a nice graphical installer to run under windows&lt;/li&gt;&lt;li&gt;&lt;a href="http://unetbootin.sourceforge.net/"&gt;UNetbootin&lt;/a&gt;, a really nice graphical installer for linux and windows&lt;/li&gt;&lt;li&gt;A grub trick for booting the installer from grub under windows described &lt;a href="http://marc.herbert.free.fr/linux/win2linstall.html"&gt;in detail&lt;/a&gt; for any linux, and in &lt;a href="http://ubuntuforums.org/showthread.php?t=28948"&gt;less detail&lt;/a&gt; but for ubuntu.&lt;/li&gt;&lt;/ul&gt;The first option was no good, because it only ran on windows. The second looked really neat and easy, and is probably the best, but being the geek that I am, I wanted to try the ideas in the third option, but 'translated' to work on my old linux (in my case ubuntu 5.04). It turned out to be pretty easy. Here are the steps I used:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I opened my downloaded ubuntu 8.04.1 server ISO image in archive manager and extracted the 'install' directory to /boot/install on my old computer. I did this with another 8.04 desktop, but could just as easily done it with the old computer itself.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I edited /boot/grub/menu.lst, adding the following lines at the bottom:&lt;pre style="overflow: auto;"&gt;title           Ubuntu 8.04.1 Installer (hd0,0)&lt;br /&gt;kernel          (hd0,0)/boot/install/netboot/ubuntu-installer/i386/linux vga=normal ramdisk_size=14972 root=/dev/rd/0 rw --&lt;br /&gt;initrd          (hd0,0)/boot/install/netboot/ubuntu-installer/i386/initrd.gz&lt;br /&gt;&lt;/pre&gt;(I actually first tried the vmlinuz and initrd.gz I found in the installer directory, but that insisted on a CD, and I did not want to try &lt;a href="http://ubuntuforums.org/showthread.php?p=83151#post83151"&gt;faking that with a raw partition&lt;/a&gt;, so I changed to the netboot option in the text above.)&lt;/li&gt;&lt;li&gt;I also commented out 'hiddenmenu' and added 'timeout 10' to menu.lst so that I would actually get to see the menu choice when I rebooted.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Finally I rebooted and choose the new installer, and, after answering a bunch of question, viola, I had a new Ubuntu 8.04.1 server!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;These instructions assume a decently fast internet access, since everything installed is downloaded. If you have the CD already (as I had), and no internet, or slow internet, you can also copy the CD to a local hard-drive partition and install from there. That was too much trouble for me, so I did not try it :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-4534499431936446076?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/4534499431936446076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=4534499431936446076' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4534499431936446076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4534499431936446076'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2008/09/install-or-upgrade-to-ubuntu-804-on.html' title='Install or upgrade to ubuntu 8.04 on linux with no media'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-3096508218403835185</id><published>2008-07-13T10:44:00.000-07:00</published><updated>2008-07-13T11:15:25.870-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='tesseract'/><category scheme='http://www.blogger.com/atom/ns#' term='ghostscript'/><category scheme='http://www.blogger.com/atom/ns#' term='scanned images'/><category scheme='http://www.blogger.com/atom/ns#' term='ocrad'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='ocr'/><title type='text'>Linux / open source OCR batch processing from PDF</title><content type='html'>I recently needed to run OCR on a PDF of scanned pages, and found no direct way to do it in Linux, but did find a suitable combination of tools that when scripted together did the job quite nicely. Firstly the job needs to be broken down into two steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Extract individual pages from PDF. None of the open source OCR software I read about or tried could run directly on PDF. The easiest way to extract from PDF is to run ghostscript and print to TIFF or PNM, for example: &lt;pre style="color: rgb(34, 34, 102); overflow: auto;"&gt;gs -r300x300 -sDEVICE=tiffgray -sOutputFile=ocr_%02d.tif -dBATCH -dNOPAUSE inputfile.pdf&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Run OCR on individual pages. I tried &lt;a href="http://www.gnu.org/software/ocrad/ocrad.html"&gt;ocrad&lt;/a&gt; and &lt;a href="http://code.google.com/p/tesseract-ocr/"&gt;tesseract&lt;/a&gt; (versions 1.02 and 2.03). Ocrad supported the Swedish characters I had in my documents but otherwise had rather poor overall OCR performance. Tesseract did not support Swedish characters, but both versions were better than Ocrad, and version 2 was overall the best (and supports many other languages if you bother to &lt;a href="http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract"&gt;train it&lt;/a&gt;). Training it on Swedish was more work than manually fixing the results, so I did not take that step, but was certainly tempted.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Since I had several PDF documents to process, and each had many pages, the above process was still too manual, so I wrote a utility Ruby script to do the work for me:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(68, 68, 68); overflow: auto; color: rgb(34, 34, 102);"&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;(ARGV.length&gt;0) || puts("usage: ./ocr.rb file1.pdf &lt;file2.pdf&gt; ...") || exit(0)&lt;br /&gt;$basedir=Dir.getwd&lt;br /&gt;ARGV.grep(/\.pdf/i).each do |pdf|&lt;br /&gt;      dir = pdf.gsub(/\.pdf/,'')&lt;br /&gt;      dir += '_OCR'&lt;br /&gt;      dir += '.dir' if(dir == pdf)&lt;br /&gt;      Dir.mkdir(dir) unless(File.exist?(dir))&lt;br /&gt;      Dir.chdir(dir)&lt;br /&gt;      puts "Extracting pages from PDF: #{pdf}"&lt;br /&gt;      system "gs -r300x300 -sDEVICE=tiffgray -sOutputFile=ocr_%02d.tif -dBATCH -dNOPAUSE \"#{$basedir}/#{pdf}\""&lt;br /&gt;      tiff_pages = Dir.new('.').grep(/^ocr.*\.tif$/).sort&lt;br /&gt;      puts "Running tesseract OCR on pages: #{tiff_pages.join(', ')}"&lt;br /&gt;      tiff_pages.each do |page|&lt;br /&gt;              page_base = page.gsub(/\.tif.*/,'')&lt;br /&gt;              print "#{page_base} "&lt;br /&gt;              system "/usr/local/bin/tesseract #{page} #{page_base}"&lt;br /&gt;      end&lt;br /&gt;      Dir.chdir($basedir)&lt;br /&gt;      ocr_pages = Dir.new(dir).grep(/^ocr.*\.txt$/).sort&lt;br /&gt;      if ocr_pages &amp;amp;&amp;amp; ocr_pages.length&gt;0&lt;br /&gt;              puts "Created OCR result pages: #{ocr_pages.join(', ')}"&lt;br /&gt;              archive = "#{dir}.zip"&lt;br /&gt;              puts "Creating archive of result pages: #{archive}"&lt;br /&gt;              system "zip -r \"#{archive}\" #{ocr_pages.map{|p| "\"#{dir}/#{p}\""}.join(' ')}"&lt;br /&gt;      else&lt;br /&gt;              puts "No OCR result pages found"&lt;br /&gt;      end&lt;br /&gt;      puts ""&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This script will extract the images to TIFF, run the Tesseract OCR on each page and finally build a ZIP file of the result with a filename similar to the original PDF. So MyDoc.PDF is converted to MyDoc_OCR.ZIP. Intermediate TIFF and TXT files are maintained in a subdirectory (MyDoc/*).&lt;br /&gt;&lt;br /&gt;If, on the other hand, I simply did not look far enough and there are better utilities and GUI applications for this on Linux, feel free to comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-3096508218403835185?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/3096508218403835185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=3096508218403835185' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/3096508218403835185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/3096508218403835185'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2008/07/linux-open-source-ocr-batch-processing.html' title='Linux / open source OCR batch processing from PDF'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-88177836348234963</id><published>2008-04-11T06:47:00.000-07:00</published><updated>2008-04-11T14:19:23.904-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bongi surgeon blog talk interview kruger_park kruger transfrontier park size england wales ireland skåne scania'/><title type='text'>Bongi's voice - and the size of the Kruger Park</title><content type='html'>My brothers blog '&lt;a href="http://other-things-amanzi.blogspot.com/"&gt;other-things-amanzi&lt;/a&gt;', which is hugely more popular than mine, for obvious reasons if you read it, just got a boost as he was invited to be interviewed on &lt;a href="http://www.blogtalkradio.com/doctoranonymous/2008/04/11/Dr-A-Show-30"&gt;BlogTalkRadio.com&lt;/a&gt;. Sid Schwab of &lt;a href="http://surgeonsblog.blogspot.com/"&gt;surgeonsblog&lt;/a&gt; fame was a guest host, which worked well as he and 'bongi' got chatting about everything from the pleasures of living near the &lt;a href="http://www.krugerpark.co.za/"&gt;Kruger National Park&lt;/a&gt;, to regional issues facing surgeons, like the &lt;a href="http://other-things-amanzi.blogspot.com/2007/04/powerful-horn.html"&gt;bad treatment&lt;/a&gt; sometimes delivered by the local witchdoctors or '&lt;a href="http://en.wikipedia.org/wiki/Sangoma"&gt;sangomas&lt;/a&gt;'.&lt;br /&gt;&lt;br /&gt;Sid even mentioned my blog, but I'm guessing the ultra-geek content stopped him in his tracks :-). Of my blog, Bongi said: 'I don't understand a single word of it!' Perhaps this post will score better?&lt;br /&gt;&lt;br /&gt;One thing Bongi said that I fear is some misinformation I might be responsible for, was that the Kruger Park is the size of England. I used to claim that myself, but recently decided to double check my facts and found I was &lt;span style="font-weight: bold;"&gt;WRONG&lt;/span&gt;! A quick google search reveals several sites claiming it is the size of Wales, and &lt;a href="http://www.african-safari-journals.com/kruger-national-park.html"&gt;one claiming it is bigger than Ireland&lt;/a&gt;:&lt;br /&gt;&lt;b style="color: rgb(0, 51, 0); font-style: italic;"&gt;(Size&lt;/b&gt;&lt;span style="color: rgb(0, 51, 0); font-style: italic;"&gt;: The Kruger Park is huge. It stretches for 350km (217 miles) from north to south and averages 60 kilometres in width which makes it bigger than Ireland. Most of the park is fenced so it is a self contained ecosystem.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, I stand corrected. So I decided to investigate and figure out what is really going on. How does the park compare to England, Ireland and Wales? Right now these are the facts I could find:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Kruger_Park"&gt;Kruger Park&lt;/a&gt;:&lt;br /&gt;Area: 18 989 km2&lt;br /&gt;Length: 350 km&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/England"&gt;England&lt;/a&gt;:&lt;br /&gt;Area: 130 395 km2&lt;br /&gt;Length: 580 km&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Wales"&gt;Wales&lt;/a&gt;:&lt;br /&gt;Area: 20 79 km2&lt;br /&gt;Length: 215 km&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Ireland"&gt;Irland&lt;/a&gt;:&lt;br /&gt;Area: 84 412 km2&lt;br /&gt;Length: 360 km&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Sk%C3%A5ne"&gt;Skåne&lt;/a&gt;:&lt;br /&gt;Area: 10 939 km2&lt;br /&gt;Length: 115 km&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Great_Limpopo_Transfrontier_Park"&gt;Great Limpopo Transfrontier Park&lt;/a&gt;:&lt;br /&gt;Area: 35 000 km2 - 99 800 km2 (planned expansion)&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(England, Ireland, Wales lengths were roughly north-south measured by me on google earth 'ruler'. Kruger length is from wikipedia.)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;So England is about 7 times the area, and about 65% longer. So the Kruger is comparable in terms of length (60% the length of England), but not by area, since the Park is so narrow. The website that claimed the park was bigger than Ireland is wrong. It's a bit shorter, and less than a quarter the area. It is, however 60% longer than Wales and nearly the same area, so that is the best match. If the &lt;a href="http://www.greatlimpopopark.com/"&gt;full-size transfrontier park&lt;/a&gt; materializes, it will close in on the size of England, which is really impressive.&lt;br /&gt;&lt;br /&gt;It is especially interesting to me that the Kruger Park is nearly twice the length and over three times the area of &lt;a href="http://en.wikipedia.org/wiki/Sk%C3%A5ne"&gt;Skåne&lt;/a&gt;, the province in Sweden in which I live.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-88177836348234963?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/88177836348234963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=88177836348234963' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/88177836348234963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/88177836348234963'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2008/04/bongis-voice.html' title='Bongi&apos;s voice - and the size of the Kruger Park'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-4142842315814685063</id><published>2008-04-04T08:14:00.001-07:00</published><updated>2008-08-14T07:33:29.440-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu hardy heron issues sudo unable to resolve host eth0 auto eclipse java6 crash'/><title type='text'>Hardy Heron Beta (and release)</title><content type='html'>I've had a generally good time with the Ubuntu 8.04 Hardy Heron Beta since it was released in late March, and have installed it on two different machines. I especially enjoyed getting compiz to work for the first time (possibly due to a new machine with better hardware, not something related to Hardy in particular). However, I have had three issues I thought worth mentioning here:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;admin-users does not work&lt;/span&gt;&lt;br /&gt;I reported this as a &lt;a href="https://bugs.launchpad.net/bugs/207804"&gt;bug&lt;/a&gt; to ubuntu. Basically the problem is that no groups or users added with gnomes user administration tool actually get added, and in one case the tool crashed. I've had to add users and groups on the command line with tools like 'addgroup' and 'adduser'.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;eclipse crashes silently&lt;/span&gt;&lt;br /&gt;This happened several times before I thought to run it in the console and catch the error, which turned out to be 'java.lang.OutOfMemoryError: PermGen space'. Normally eclipse reports this to the user in a dialog, and I do not know why that was not done, but the solution is the same, add '-vmargs -Xmx1280m -XX:MaxPermSize=1024m' or similar to the eclipse launcher. I noticed the error first happen after switching from the Ruby to the Java perspective, and the virtual memory requirements of eclipse jumped from 0.5GB to 1.2GB. Amazing. (update: the symptoms returned on a new java6 update, and the new fix was to add &lt;b&gt;-XX:CompileCommand=exclude,org/eclipse/core/internal/dtree/DataTreeNode,forwardDeltaWith&lt;/b&gt; to vmargs - see comments below for more details)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;unable to set HumanList theme for login window&lt;/span&gt;&lt;br /&gt;Once a change to the login window settings were made, logging out waited indefinitely (or in one case just about 30 minutes), before showing the login screen. No errors in the X log or any other log. Nasty. I had to kill gdm and hand edit gdm.conf-custom to remove the theme line.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sudo fails with: unable to resolve host&lt;/span&gt;&lt;br /&gt;I found a lot of discussion about this on the internet, but in most cases it was due to people foolishly changing their hosts files. While sudo should not be sensitive to something like that, it was not my situation. I simply ran the usual daily upgrade with the list of updates for Hardy, and after the reboot this issue happened. With a lot of investigation I found how to 'fix' it, by getting /etc/hosts and /etc/hostname to have the same entry. Interestingly enough they do not have the same entry if you enter the 'obvious' values in the network manager applet for host and domain. For example, putting 'foo' and 'bar.com' as host and domain will put 'foo' into /etc/hostname and 'foo.bar.com' on the 127.0.1.1 line in /etc/hosts. My sudo continued to work for a week before my reboot because my DNS settings, and my 'search' list in particular allowed 'foo' to be resolved even without the 'bar.com', but after the reboot it failed due to the additional issue below:&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;static eth0 failed on reboot&lt;/span&gt;&lt;br /&gt;Strangely enough eth0 appeared on the ifconfig output, but with no IP address, while my network configuration in the network applet, as well as in /etc/network/interfaces, looked just fine. I needed to add 'auto eth0' to the config file to get it to work correctly. I vaguely remember seeing this before on much older ubuntu versions, but have not seen it for a while, so it was quite a surprise. This issue caused the sudo issue above to appear suddenly after a reboot.&lt;/li&gt;&lt;/ol&gt;The sudo and eth0 issue was tricky to deal with because a non-working sudo means you cannot access and/or edit the files you need to to get things working. I found reports of people rebooting to single user or recovery mode, and other booting the live CD to access the hard drive, both of which seem like an over-sized hammer for this small nail. One mentioned using 'aptitude' and the the menu to switch to root, but from there I could not get a shell from there. One mentioned using gksudo to run xterm as root, and that should work. I tried to used the network admin tool to fiddle settings until I got the hosts and hostname files to match. This was not easy because that tool did not allow simple hostnames (no domains) in the hosts file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-4142842315814685063?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/4142842315814685063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=4142842315814685063' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4142842315814685063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4142842315814685063'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2008/04/hardy-heron-beta.html' title='Hardy Heron Beta (and release)'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-5045070473822016201</id><published>2008-03-10T05:55:00.000-07:00</published><updated>2008-04-27T15:46:29.824-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='restful_authentication'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='acts_as_state_machine'/><title type='text'>Rails authentication: restful_authentication and acts_as_state_machine</title><content type='html'>I have written a couple of rails apps with user authentication, but finally decided to start using some of the excellent plugins available for this. After a quick search I got the impression that restful_authentication was the current standard for rails (I'm using rails 2.0.2 at the moment), and especially with the link to the state machine plugin. However, my initial quick search did not yield a decent quick 'howto' for fast-tracking getting this all working. So I started writing notes on my findings here in my blog:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Create your rails application:&lt;pre style="overflow: auto;"&gt;rails -d mysql myapp&lt;br /&gt;cd myapp&lt;br /&gt;rake db:create   # you might need to edit config/database.yml first to match your db installation&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Install the two plugins required:&lt;pre style="overflow: auto;"&gt;script/plugin install http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk&lt;br /&gt;# I needed to use trunk, as other versions have a missing const RailsStudio error&lt;br /&gt;script/plugin source http://svn.techno-weenie.net/projects/plugins&lt;br /&gt;script/plugin install restful_authentication&lt;br /&gt;# obviously these last two lines can be combined&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create the users model and controllers:&lt;br /&gt;&lt;pre style="overflow: auto;"&gt;script/generate authenticated user sessions --include-activation --stateful&lt;br /&gt;# This will create the users model and the users and sessions controllers.&lt;/pre&gt;&lt;br /&gt;It also adds map.resource entries for these in the routes.rb file. 'include-activation' is for email activation and 'stateful' is the tie to the state machine (for easily managing user activation and login status)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Edit the routes.rb file to specify the user states and add some useful routes:&lt;pre style="overflow: auto;"&gt;map.resources :users, :member =&gt; {&lt;br /&gt;:suspend =&gt; :put,&lt;br /&gt;:unsuspend =&gt; :put,&lt;br /&gt;:purge =&gt; :delete&lt;br /&gt;}&lt;br /&gt;map.resource :session&lt;br /&gt;map.activate '/activate/:activation_code', :controller =&gt; 'users', :action =&gt; 'activate'&lt;br /&gt;map.signup '/signup', :controller =&gt; 'users', :action =&gt; 'new'&lt;br /&gt;map.login '/login', :controller =&gt; 'sessions', :action =&gt; 'new'&lt;br /&gt;map.logout '/logout', :controller =&gt; 'sessions', :action =&gt; 'destroy'&lt;br /&gt;map.forgot_password '/forgot_password', :controller =&gt; 'users', :action =&gt; 'forgot_password'&lt;br /&gt;map.reset_password '/reset_password/:code', :controller =&gt; 'users', :action =&gt; 'reset_password'&lt;br /&gt;map.account '/account', :controller =&gt; 'users', :action =&gt; 'account'&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Edit the environment.rb file to include the line:&lt;pre style="overflow: auto;"&gt;config.active_record.observers = :user_observer&lt;/pre&gt;This allows for activation emails to be sent.&lt;/li&gt;&lt;li&gt;Edit the migration, in this case db/migrate/001_create_users.rb, and add lines for the 'forgot password' feature and the option to have administrator users:&lt;pre stype="overflow:auto;"&gt;t.column :password_reset_code,       :string, :limit =&gt; 40&lt;br /&gt;t.column :is_admin,                  :boolean, :default =&gt; false&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Update the database:&lt;pre style="overflow: auto;"&gt;rake db:migrate&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Remove the following line from sessions_controller and users_controller and add it to application_controller to enable authentication application wide:&lt;pre style="overflow: auto;"&gt;include AuthenticatedSystem&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Remove or comment out these two lines from the UsersController.create method:&lt;pre style="overflow: auto;"&gt;self.current_user = @user&lt;br /&gt;redirect_back_or_default('/')&lt;/pre&gt;This allows us to add further processing of the user registration request, by adding a create.html.erb view and email activation.&lt;/li&gt;&lt;li&gt;Add the view/users/create.html.erb file with content similar to:&lt;pre style="overflow: auto;"&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;lt;legend&amp;gt;New account&amp;lt;/legend&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;Instructions for activating your account&lt;br /&gt;have been sent to &amp;lt;%=h @user.email %&amp;gt;&lt;br /&gt;If this address is incorrect, please&lt;br /&gt;&amp;lt;%= link_to 'signup', signup_path %&amp;gt;&lt;br /&gt;again. If you do not receive the email&lt;br /&gt;soon, please check your spam filter.&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/fieldset&amp;gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Add the following helper methods to application_helper.rb:&lt;pre style="overflow: auto;"&gt;def user_logged_in?&lt;br /&gt;session[:user_id]&lt;br /&gt;end&lt;br /&gt;def user_is_admin?&lt;br /&gt;session[:user_id] &amp;amp;&amp;amp; (user = User.find(session[:user_id])) &amp;amp;&amp;amp; user.is_admin&lt;br /&gt;end&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Add a 'forgot password?' link to the views/sessions/new.html.erb form (usually near the 'submit tag'):&lt;pre style="overflow: auto;"&gt;&amp;lt;%= link_to 'Forgot password?', forgot_password_url %&amp;gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Add links to login/out and signup to your main page or layout. For example, I used a fixed position div like this:&lt;pre style="overflow: auto;"&gt;&amp;lt;div style="position: absolute; right: 0px; top: 0px; height: 20px;"&amp;gt;&lt;br /&gt;&amp;lt;% if user_logged_in? %&amp;gt;&lt;br /&gt;&amp;lt;%= link_to 'Logout', logout_url %&amp;gt;&lt;br /&gt;&amp;lt;% else %&amp;gt;&lt;br /&gt;&amp;lt;%= link_to 'Signup', signup_url %&amp;gt;&lt;br /&gt;| &amp;lt;%= link_to 'Login', login_url %&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Support admin restrictions with the following method in the application controller:&lt;pre style="overflow: auto;"&gt;protected&lt;br /&gt;# Protect controllers with code like:&lt;br /&gt;#   before_filter :admin_required, :only =&gt; [:suspend, :unsuspend, :destroy, :purge]&lt;br /&gt;def admin_required&lt;br /&gt;current_user.respond_to?('is_admin') &amp;amp;&amp;amp; current_user.send('is_admin')&lt;br /&gt;end&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;If you want admin control, add a before filter to the users_controller to restrict key actions to admin users only:&lt;pre style="overflow: auto;"&gt;before_filter :admin_required, :only =&gt; [:suspend, :unsuspend, :destroy, :purge]&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Add actions in users_controller.rb for account, change_password, forgot_password and reset_password:&lt;pre style="overflow: auto; height: 300px;"&gt;&lt;br /&gt;def account&lt;br /&gt;if logged_in?&lt;br /&gt;@user = current_user&lt;br /&gt;else&lt;br /&gt;flash[:alert] = 'You are not logged in - please login first'&lt;br /&gt;render :controller =&amp;gt; 'session', :action =&amp;gt; 'new'&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# action to perform when the user wants to change their password&lt;br /&gt;def change_password&lt;br /&gt;return unless request.post?&lt;br /&gt;if User.authenticate(current_user.login, params[:old_password])&lt;br /&gt;#      if (params[:password] == params[:password_confirmation])&lt;br /&gt;current_user.password_confirmation = params[:password_confirmation]&lt;br /&gt;current_user.password = params[:password]&lt;br /&gt;if current_user.save&lt;br /&gt; flash[:notice] = "Password updated successfully"&lt;br /&gt; redirect_to account_url&lt;br /&gt;else&lt;br /&gt; flash[:alert] = "Password not changed"&lt;br /&gt;end&lt;br /&gt;#      else&lt;br /&gt;#        flash[:alert] = "New password mismatch"&lt;br /&gt;#        @old_password = params[:old_password]&lt;br /&gt;#      end&lt;br /&gt;else&lt;br /&gt;flash[:alert] = "Old password incorrect"&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# action to perform when the users clicks forgot_password&lt;br /&gt;def forgot_password&lt;br /&gt;return unless request.post?&lt;br /&gt;if @user = User.find_by_email(params[:user][:email])&lt;br /&gt;@user.forgot_password&lt;br /&gt;@user.save&lt;br /&gt;redirect_back_or_default('/')&lt;br /&gt;flash[:notice] = "A password reset link has been sent to your email address: #{params[:user][:email]}"&lt;br /&gt;else&lt;br /&gt;flash[:alert] = "Could not find a user with that email address: #{params[:user][:email]}"&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# action to perform when the user resets the password&lt;br /&gt;def reset_password&lt;br /&gt;@user = User.find_by_password_reset_code(params[:code])&lt;br /&gt;return if @user unless params[:user]&lt;br /&gt;&lt;br /&gt;if ((params[:user][:password] &amp;amp;&amp;amp; params[:user][:password_confirmation]))&lt;br /&gt;self.current_user = @user # for the next two lines to work&lt;br /&gt;current_user.password_confirmation = params[:user][:password_confirmation]&lt;br /&gt;current_user.password = params[:user][:password]&lt;br /&gt;@user.reset_password&lt;br /&gt;flash[:notice] = current_user.save ? "Password reset successfully" : "Unable to reset password"&lt;br /&gt;redirect_back_or_default('/')&lt;br /&gt;else&lt;br /&gt;flash[:alert] = "Password mismatch"&lt;br /&gt;end&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create html.erb forms in views/users for the change_password, forgot_password and reset_password actions.&lt;/li&gt;&lt;li&gt;Edit models/user_mailer.rb and replace YOURSITE and ADMINEMAIL with values appropriate for the new website. A good way of doing this is to define the variable SITE in the config/environments/*.rb files and then use that in the strings in the UserMailer with the "#{SITE}" format. Also add methods for forgot_password and reset_password (ie. send mails when those actions are invoked):&lt;pre style="overflow: auto; height: 300px;"&gt;class UserMailer &amp;lt; ActionMailer::Base&lt;br /&gt; def signup_notification(user)&lt;br /&gt;   setup_email(user,'Please activate your new account')&lt;br /&gt;   @body[:url]  = "#{SITE}/activate/#{user.activation_code}"&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; def activation(user)&lt;br /&gt;   setup_email(user,'Your account has been activated!')&lt;br /&gt;   @body[:url]  = "#{SITE}/"&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; def forgot_password(user)&lt;br /&gt;   setup_email(user,'You have requested to change your password')&lt;br /&gt;   @body[:url]  = "#{SITE}/reset_password/#{user.password_reset_code}"&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; def reset_password(user)&lt;br /&gt;   setup_email(user,'Your password has been reset.')&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt;protected&lt;br /&gt;&lt;br /&gt; def setup_email(user,subj=nil)&lt;br /&gt;   recipients  "#{user.email}"&lt;br /&gt;   from        %{"Your Admin" &amp;lt;bounce@yourdomain.com&amp;gt;}&lt;br /&gt;   subject     "[#{SITE}] #{subj}"&lt;br /&gt;   sent_on     Time.now&lt;br /&gt;   body        :user =&amp;gt; user&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Add forgot_password.html.erb and reset_password.html.erb to the user_mailer view.&lt;/li&gt;&lt;li&gt;Add methods to models/user.rb: forgot_password, reset_password, recently_forgot_password, recently_reset_password and recently_activated. Also add protected method make_password_reset_code.&lt;pre style="overflow: auto; height: 300px;"&gt;  def forgot_password&lt;br /&gt;    @forgotten_password = true&lt;br /&gt;    self.make_password_reset_code&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def reset_password&lt;br /&gt;    # First update the password_reset_code before setting the&lt;br /&gt;    # reset_password flag to avoid duplicate mail notifications.&lt;br /&gt;    update_attributes(:password_reset_code =&gt; nil)&lt;br /&gt;    @reset_password = nil&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  # Used in user_observer&lt;br /&gt;  def recently_forgot_password?&lt;br /&gt;    @forgotten_password&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  # Used in user_observer&lt;br /&gt;  def recently_reset_password?&lt;br /&gt;    @reset_password&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  # Used in user_observer&lt;br /&gt;  def recently_activated?&lt;br /&gt;    @activated&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;protected&lt;br /&gt;  def make_password_reset_code&lt;br /&gt;    self.password_reset_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )&lt;br /&gt;  end&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Modify UserObserver.after_save(user) to send activation only based on user.recently_activated? Also add to this method mail sending for forgot_password and reset_password events:&lt;pre style="overflow: auto;"&gt;  def after_save(user)&lt;br /&gt;   UserMailer.deliver_activation(user) if user.recently_activated?&lt;br /&gt;   UserMailer.deliver_forgot_password(user) if user.recently_forgot_password?&lt;br /&gt;   UserMailer.deliver_reset_password(user) if user.recently_reset_password?&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Make sure your mail subsystem is properly prepared to send mail. I installed postfix on my development and deployment machines (both ubuntu, so I used 'apt-get install postfix'). It is a good idea to test this with a command-line mail like:&lt;pre style="overflow: auto;"&gt;sendmail -f admin@mydomain.com me@myaddress.com&lt;br /&gt;Subject: test&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hello, world!&lt;br /&gt;.&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Add appropriate administrative links. In my case I created an 'account' route to a new account action and view in the users controller, and in this displayed current user settings and provided a link to the 'change_password' action. Since this is very similar to many of the actions above, it is left as an exercise to the reader :-)&lt;/li&gt;&lt;li&gt;Test everything, sign up a user, login, logout, click 'forgot password', respond to all emails sent, change the password, etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;What's next? Well, in my case I continued by adding a boolean 'is_admin' flag to the users table and then adding extra capability to my site for admin users. I also created a cool layout and used it for all controllers in my site. This is rails after all, the sky is the limit :-)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-5045070473822016201?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/5045070473822016201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=5045070473822016201' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/5045070473822016201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/5045070473822016201'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2008/03/rails-authentication.html' title='Rails authentication: restful_authentication and acts_as_state_machine'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-5947721565747159322</id><published>2008-03-07T04:39:00.000-08:00</published><updated>2008-03-07T04:54:54.593-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microsoft cool gadgets research'/><title type='text'>Even Microsoft is getting cool</title><content type='html'>When you think of 'cool' modern companies, names like '&lt;a href="http://gigaom.com/2005/03/26/how-yahoo-got-its-mojo-back/"&gt;yahoo&lt;/a&gt;' and '&lt;a href="http://www.alternet.org/story/18681/"&gt;google&lt;/a&gt;' spring to mind. For many '&lt;a href="http://www.wired.com/gadgets/mac/news/2003/09/60287"&gt;apple&lt;/a&gt;' is also synonymous with cool. But Microsoft generally never gets that classification. 'Serious', 'business focused', even '&lt;a href="http://boycottnovell.com/2008/01/21/colombia-minister-gplv3-program/"&gt;ruthless&lt;/a&gt;'. But take a look at the &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;articleId=9066784"&gt;photo gallery of research projects &lt;/a&gt;from Microsoft's seventh annual techFest. Now that is cool!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;articleId=9066784"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_kg7-gho6F0M/R9E5ARdx7iI/AAAAAAAAArk/kf78Dkgz5Go/s400/gaudin1thumb.jpg" alt="" id="BLOGGER_PHOTO_ID_5174980123676503586" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-5947721565747159322?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/5947721565747159322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=5947721565747159322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/5947721565747159322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/5947721565747159322'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2008/03/even-microsoft-is-getting-cool.html' title='Even Microsoft is getting cool'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_kg7-gho6F0M/R9E5ARdx7iI/AAAAAAAAArk/kf78Dkgz5Go/s72-c/gaudin1thumb.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-2417727787472502069</id><published>2008-02-19T08:15:00.000-08:00</published><updated>2008-02-19T08:36:23.376-08:00</updated><title type='text'>IT back to business</title><content type='html'>A recent &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;articleId=9062338"&gt;ComputerWorld article&lt;/a&gt; describes a 'new trend' in IT towards having business savy 'IT' people working within business departments instead of centralized generic IT personnel. I think this is a trend that started a while ago with pragmatic companies focusing on operational efficiency. Unfortunately not all companies are pragmatic, but hopefully more start to follow this trend.&lt;br /&gt;&lt;br /&gt;I had a gripe with the way IT was moving in two previous companies I worked for. In the first, the IT department was standardized across the very large international organization, and focused on the common low-tech user, which was completely unsuitable for our high-tech development site, dramatically restricting our efficiency. We had to do our own internal 'skunk-works' IT, and hide the costs, in order to operate efficiently. My worst case horror story was the time it took 6 months and 5 engineers in 4 countries to install a local printer! (previously we had one local IT tech who would do it in a couple of hours).&lt;br /&gt;&lt;br /&gt;The second company was a start-up which meant it had good pragmatic IT for a while, but as it grew, the new management tried to increase operational efficiency by 'centralizing' and 'standardizing' IT. Sounds good on paper, but simply does not work in reality. Costs increased and performance decreased due to the separation of IT from the people actually doing the business. People working towards true operational efficiency were marginalized and often left the company. By the time I left it was well on the way to the level of &lt;span style="font-style: italic;"&gt;operational inefficiency&lt;/span&gt; of the large multi-national I worked with before.&lt;br /&gt;&lt;br /&gt;Over the years I've developed a very strong feeling that IT must be integrated into the business. I'm thrilled to see a &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;articleId=9062338"&gt;prominent article&lt;/a&gt; claiming this as an industry trend! So I end this blog with a nice quote:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;"&lt;span style="color: rgb(51, 51, 51);"&gt;I want them to think of themselves as people who work for this company, not people who work for this company's IT department," he says. "We have an energy supply business to manage. That's our business, and we want to do it as efficiently as possible. It doesn't really matter what the IT job is."&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/7497898-2417727787472502069?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/2417727787472502069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=2417727787472502069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2417727787472502069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2417727787472502069'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2008/02/it-back-to-business.html' title='IT back to business'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-5735999015479953047</id><published>2008-01-23T04:20:00.000-08:00</published><updated>2008-01-23T06:36:09.679-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='sun'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='acquisition'/><category scheme='http://www.blogger.com/atom/ns#' term='jazz'/><category scheme='http://www.blogger.com/atom/ns#' term='jazz music'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>Jazz, software development and the Sun/MySQL deal</title><content type='html'>Jazz - I kept hearing that word over and over the last couple of weeks, culminating in me finally joining YouTube and putting together a &lt;a href="http://www.youtube.com/view_play_list?p=D6E0B5D64EF5874B"&gt;play list of jazz music videos&lt;/a&gt;. However, it all started with software development:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First IBM announced the partial open sourcing of their &lt;a href="http://jazz.net/"&gt;jazz.net&lt;/a&gt; service. This was interestingly relevant to my current search for on-line software project hosting services. The &lt;a href="http://jazz.net/"&gt;jazz.net&lt;/a&gt; site says: '&lt;span style="font-style: italic;"&gt;Developing software in a team is much         like playing an instrument in a band. Both require a balance of         collaboration and virtuosity. Jazz defines a vision for the way         products can integrate to support this kind of collaborative work, and         a technology platform to deliver on this vision.&lt;/span&gt;' Sounds great, but I'm not sure it is mature enough to replace my current top contender: &lt;a href="http://launchpad.net/"&gt;launchpad.net&lt;/a&gt;. However, considering the great job IBM did with eclipse, I'm certainly going to keep an eye on this new offering.&lt;/li&gt;&lt;li&gt;Then I read an article about the new trend in developer recruitment, calling top candidates '&lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;articleId=9057899&amp;amp;source=rss_news50"&gt;rock star coders&lt;/a&gt;'. This trend was countered by some well written blogs asserting that it is better to be a 'jazz musician programmer':&lt;/li&gt;&lt;ul&gt;&lt;li&gt;'&lt;a href="http://deadprogrammersociety.blogspot.com/2007/05/i-would-rather-be-jazz-programmer.html"&gt;I would rather be a jazz programmer&lt;/a&gt;' does a lovely comparison of rock stars and jazz musicians w.r.t. programming, emphasising creativity. I tried to paraphrase the key points here, but I think it just has to be read, so go &lt;a href="http://deadprogrammersociety.blogspot.com/2007/05/i-would-rather-be-jazz-programmer.html"&gt;take a look&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;'&lt;a href="http://haacked.com/archive/2007/05/30/id-rather-be-a-dj-than-a-rockstar-developer.aspx"&gt;I'd rather be a DJ than a rock star developer&lt;/a&gt;' likes the jazz programmer idea, but prefers to be a DJ, emphasising code reuse and web-mashups.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;'&lt;a href="http://chrismcmahonsblog.blogspot.com/2007/05/example-of-analogy-monks-vs-music.html"&gt;Monks versus music&lt;/a&gt;' says that agile development teams are a lot like 'jazz bands'. This blog got me onto the YouTube jazz search, starting with Count Bassie and culminating with Nora Jones! In many videos artists joined forces to create a blend of music. I really like Nora Jones singing with Ray Charles, what a combo!&lt;object height="266" width="319"&gt;&lt;param name="movie" value="http://www.youtube.com/v/KctNZTkCfCc&amp;amp;rel=1&amp;amp;autoplay=1"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/KctNZTkCfCc&amp;amp;rel=1&amp;amp;autoplay=1" type="application/x-shockwave-flash" wmode="transparent" height="266" width="319"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://weblog.infoworld.com/openresource/archives/2008/01/more_on_suns_ac.html?source=NLC-OPENENTERPRISE&amp;amp;cgd=2008-01-22"&gt;Sun's acquisition of MySQL&lt;/a&gt; - OK, no jazz mentioned there, but with jazz on my mind I saw a fit. It is yet another interesting merger of talents, the mature Sun trying their hand at the new world of open source, partnering with the younger, hipper MySQL with a very solid open source presence. It reminded me so much of the YouTube video of Ray Charles being introduced by Johnny Cash and then singing Johnny's song '&lt;a href="http://www.youtube.com/watch?v=IhGZdSkX6IM"&gt;Ring of Fire&lt;/a&gt;' with a strong jazz slant. Let's see if MySQL will jazz up Sun's product offerings, or will Sun dull down MySQL? (considering Sun's recent moves towards open source, with Java and Solaris, I'm betting on the former, which is great).&lt;br /&gt;&lt;/li&gt;&lt;object height="266" width="319"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IhGZdSkX6IM&amp;amp;rel=1"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/IhGZdSkX6IM&amp;amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" height="266" width="319"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-5735999015479953047?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/5735999015479953047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=5735999015479953047' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/5735999015479953047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/5735999015479953047'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2008/01/jazz.html' title='Jazz, software development and the Sun/MySQL deal'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-2720500081323963686</id><published>2007-11-02T11:20:00.000-07:00</published><updated>2009-06-11T08:13:33.331-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='radrails'/><category scheme='http://www.blogger.com/atom/ns#' term='jaunty'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='hardy'/><title type='text'>Quick Ruby on Rails on Ubuntu 7.10 (and 8.04 and 9.04)</title><content type='html'>There are many howto's on this subject out there, but since I ended up blending a few of them to get exactly the environment I wanted setup (and took notes so I could repeat this), I thought I'd blog it for future reference, and hopefully this info is useful to others.&lt;br /&gt;&lt;br /&gt;So, what exactly do I want: a development and deployment machine with the following specifications:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A recent &lt;span style="font-weight: bold;"&gt;Ubuntu&lt;/span&gt; Linux, in this case 7.10 (Gutsy Gibbon) &lt;span style="font-weight: bold; font-style: italic;"&gt;[update: I also installed on 8.04, hardy heron beta, with good success]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;[update2: I have now installed on 9.04, with a few changes]&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Web-App server comprised of apache2, mongrel, &lt;span style="font-weight: bold;"&gt;ruby on rails&lt;/span&gt;, mysql5&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Development environment comprised of Aptana &lt;span style="font-weight: bold;"&gt;RadRails &lt;/span&gt;(based on &lt;span style="font-weight: bold;"&gt;eclipse&lt;/span&gt;), for both &lt;span style="font-weight: bold;"&gt;Java and Ruby on Rails&lt;/span&gt; development (I use Java for other projects, but also plan to do some JRuby work), and since eclipse rocks, I use it for everything I can, even rails. If you don't want java development, you can use the pure Aptana IDE, but then you also loose out on CVS support).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some additional libraries for graphics and charting support in the rails apps.&lt;/li&gt;&lt;/ul&gt;The quickest setup procedure that worked for me, on four very different computers, a Dell Precision 380 desktop, an Acer Aspire 3100 laptop and most recently a Packard Bell quad core workstation and Acer Aspire 7530G, was:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Install ubuntu&lt;/span&gt;. I simply did a standard install from the live cd (downloaded from &lt;a href="http://www.ubuntu.com/"&gt;www.ubuntu.com&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Update all packages&lt;/span&gt;. I usually just click the update icon on the top right of the screen, but you can use synaptic ('mark all updates' and then 'apply'), or apt-get with the following commands:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sudo apt-get update&lt;/li&gt;&lt;li&gt;sudo apt-get upgrade&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Install packages&lt;/span&gt; required for this setup. I used synaptic, but you could just as easily use 'sudo apt-get install ...':&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sun-java6-jdk / openjdk-6-jdk (includes a number of other required packages)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;sun-java6-source / openjdk-6-source (optional)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;joe (just my preferred old text editor, you choose what you like)&lt;/li&gt;&lt;li&gt;flashplugin-nonfree (since I will need that for some sites I view/develop)&lt;/li&gt;&lt;li&gt;ruby-full (bundles a bunch of ruby packages, including irb, rdoc and ri, but not rake and rubygems, see later for those - do not install them as ubuntu packages now)&lt;/li&gt;&lt;li&gt;apache2 (provides version 2.2)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;mysql-server (provides version 5.0)&lt;/li&gt;&lt;li&gt;libsqlite3-dev (required for the gem install of sqlite3-ruby, if you need that)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;build-essential (provides a c/c++ development environment required by some ruby gems which build on install)&lt;/li&gt;&lt;li&gt;libmysqlclient15-dev (required by the mysql ruby library)&lt;/li&gt;&lt;li&gt;eclipse (for 3.2 support in ubuntu 7.10 and 8.04) - to get eclipse 3.3 or 3.4 you need to download it from www.eclipse.org.&lt;/li&gt;&lt;li&gt;On recent versions of Ubuntu (like 9.04) you also need to install xulrunner as described at &lt;a href="http://bearfruit.org/blog/2008/06/10/fixing-eclipse-after-the-firefox-3-rc1-update-in-ubuntu-8-04"&gt;this link&lt;/a&gt;. This is to get around a library issue between SWT (in eclipse) and Firefox3.0.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Install rubygems&lt;/span&gt; from source. This is a contested point, as ubuntu provides rubygems as a package also, but since it is a package management facility itself, it can &lt;a href="https://help.ubuntu.com/community/RubyOnRails"&gt;conflict with the debian package management provided by ubuntu&lt;/a&gt;, so it is easiest to keep it completely separate:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;wget http://rubyforge.org/frs/download.php/57643/rubygems-1.3.4.tgz&lt;/li&gt;&lt;li&gt;tar xzvf rubygems-1.3.4.tgz&lt;/li&gt;&lt;li&gt;cd rubygems-1.3.4&lt;/li&gt;&lt;li&gt;sudo ruby setup.rb&lt;/li&gt;&lt;li&gt;sudo ln -s /usr/bin/gem1.8 /usr/bin/gem  # This was not required for rubygems 0.9.4, but is required now on ubuntu with rubygems 1.0.1 and above&lt;br /&gt;&lt;/li&gt;&lt;li&gt;sudo gem update --system    # With 0.9.4 I needed to repeat this as the first time gave an error, but with 1.0.1 and 1.3.4 it worked first time&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Use rubygems to &lt;span style="font-weight: bold;"&gt;install rails &lt;/span&gt;and some other useful gems using the command 'sudo gem install X' where X is any number of the following (I did all):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;rails  # this includes dependencies like rake&lt;/li&gt;&lt;li&gt;mongrel  # for the deployment server&lt;br /&gt;&lt;/li&gt;&lt;li&gt;mongrel_cluster  # if you want to try out clustering&lt;/li&gt;&lt;li&gt;capistrano  # if you want to do the easy deployment as described in the 'agile' book&lt;/li&gt;&lt;li&gt;mysql # for mysql database access from ruby&lt;/li&gt;&lt;li&gt;termios # well, this was mentioned in several blogs and the agile book, so I just did it :-)&lt;/li&gt;&lt;li&gt;sqlite3-ruby (sqlite3 is now the default database in rails2, so you might need this)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Add the Aptana &lt;span style="font-weight: bold;"&gt;Radrails &lt;/span&gt;plugins to the eclipse IDE:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Start eclipse from the applications menu&lt;/li&gt;&lt;li&gt;Go to menu 'Help-&gt;Software Updates-&gt;Find and Install'&lt;/li&gt;&lt;li&gt;Select 'Search for new features to install' and click 'Next'&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Click 'New Remote Site'&lt;/li&gt;&lt;li&gt;Enter name as 'Apatana' and URL 'http://update.aptana.com/install/3.2' and click OK&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Click 'New Remote Site' again&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Enter name as 'Apatana Radrails' and URL 'http://update.aptana.com/install/&lt;span style="font-weight: bold; font-style: italic;"&gt;rails&lt;/span&gt;/3.2' and click OK&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Click 'finish' to start the search for updates&lt;/li&gt;&lt;li&gt;Once the search is complete, you should check both 'aptana' and 'aptana radrails' and click 'next' to install&lt;/li&gt;&lt;li&gt;Accept the license agreement and click 'next' and then 'finish' to start the actual download&lt;/li&gt;&lt;li&gt;When prompted click 'install all' to finish the install&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Restart eclipse&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Modify Eclipse to use &lt;span style="font-weight: bold;"&gt;Java6&lt;/span&gt; (based on http://help.ubuntu.com/community/EclipseIDE). For Ubuntu 8.04 and 9.04, this was not necessary, but I did it for Ubuntu 7.10 and earlier.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;edit /etc/eclipse/java_home and move java6 up in the list so that eclipse uses java6 for running itself (which is faster)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;To get projects inside eclipse to use java6, open eclipse and go to the menu 'Window-&gt;Preferences-&gt;Java-&gt;JREs' and select the Java6 JRE.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Add some extra libraries to rails (optional, depends on your apps):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I wanted ImageMagick for photo uploads and resizing in my rails apps, so I installed the ubuntu package for ImageMagick using synaptic, and then installed the rubygem 'mini-magick'. I had tried 'RMagick', but the gem did not install, and online help indicates that you need to re-install ImageMagick from source to get RMagick to work, so I opted for the simpler mini-magick.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;For charting support in my web apps, the popular approach of using &lt;a href="http://www.khanspot.com/2006/11/09/charts-in-ruby-using-gruff/"&gt;'gruff' wrapping ImageMagick&lt;/a&gt; seemed to generate a lot of help requests, so I went for the lighter approach of using client side flash as described in the following &lt;a href="http://blogs.tech-recipes.com/johnny/2006/08/29/ruby-on-rails-beautiful-charts-made-easy-using-flash-with-rails-rxml-templates/"&gt;blog&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;For nicer color control, I installed pdf-writer to get the color-tools gem (and in case I needed pdf-writer itself for future development).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Once you have created a rails app, using the usual 'rails myapp', you should consider adding a number of cool rails plugins. There are a &lt;a href="http://agilewebdevelopment.com/plugins/"&gt;huge number&lt;/a&gt; out there. Currently I'm using attachment_fu, will_paginate, acts_as_state_machine, restful_authentication and ext_scaffold. See some of my more recent blogs for some more info on these.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Miscellaneous. I also changed my ubuntu font sizes down to 9pt on 'system-&gt;preferences-&gt;appearance' to get a bit more screen real-estate on the laptop. Windows uses smaller fonts so it looks better (to me), especially when developing in an IDE like eclipse where it is nice to have many panels open together. And for some reason the Ubuntu install had visual effects disabled (Composite extension not available), so I needed to edit /etc/X11/xorg.conf and change the "0" to a "1" on the Composite line near the end of the file. And I changed the theme to 'glossy' but with 'human' icons and darker colors. Looks cool now!&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Well, quiet a few steps, but most of the time the computer is downloading packages, updates, plugins and gems from the internet, so you can just lounge around with a good latte :-)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_kg7-gho6F0M/RyuRVdXJ-uI/AAAAAAAAArI/avs3F_a6kfM/s1600-h/Screenshot.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_kg7-gho6F0M/RyuRVdXJ-uI/AAAAAAAAArI/avs3F_a6kfM/s400/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5128352398536473314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And of course the required screenshot, this one is of the Acer laptop with firefox showing this page and eclipse with a Ruby on Rails application in production (ubuntu 7.10).&lt;br /&gt;&lt;br /&gt;Next steps - there are lots of blogs out there on setting up production deployments for rails, and here's one I just read: &lt;a href="http://www.urbanpuddle.com/articles/2008/01/09/install-ruby-on-rails-on-ubutu-gutsy-gibbon-apache-version"&gt;http://www.urbanpuddle.com/articles/2008/01/09/install-ruby-on-rails-on-ubutu-gutsy-gibbon-apache-version&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-2720500081323963686?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/2720500081323963686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=2720500081323963686' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2720500081323963686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2720500081323963686'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2007/11/quick-ruby-and-rail-on-ubuntu-710.html' title='Quick Ruby on Rails on Ubuntu 7.10 (and 8.04 and 9.04)'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_kg7-gho6F0M/RyuRVdXJ-uI/AAAAAAAAArI/avs3F_a6kfM/s72-c/Screenshot.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-2629664744074925576</id><published>2007-06-01T05:00:00.000-07:00</published><updated>2007-06-01T09:27:26.632-07:00</updated><title type='text'>VMWare &amp; Dual-Boot Ubuntu Feisty and Windows XP</title><content type='html'>A long title I know, but I had to do some serious google searches to get this to work, and it was thanks to other long titles that I found the info I needed. So let me start with the references:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;VMWare's document: &lt;a href="http://www.vmware.com/support/ws45/doc/disks_dualboot_ws.html"&gt;Configuring a Dual-Boot Computer for Use with a Virtual Machine&lt;/a&gt; - good background info covering many (but not all) issues.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.motin.eu/www/mirror/physvmware/"&gt; Running VMWare on a Physical Partition&lt;/a&gt; by Scott Bronson is a really good howto-style article with most of the details you need to do the job step-by-step.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ubuntugeek.com/how-to-install-vmware-server-from-canonical-commercial-repository-in-ubuntu-feisty.html"&gt;How to install Vmware server From Canonical commercial repository in Ubuntu Feisty&lt;/a&gt; - that got me onto the easy install route&lt;/li&gt;&lt;li&gt;&lt;a href="http://gentoo-wiki.com/HOWTO_Configure_a_dual_boot_windows_linux_to_be_able_to_open_each_os_in_vmware"&gt;HOWTO Configure a dual boot windows linux to be able to open each os in vmware&lt;/a&gt; - gentoo based article, but had an interesting suggestion for windows IDE drivers.&lt;/li&gt;&lt;/ol&gt;So, as the first vmware document says, this is not necessarily a very easy thing to do, getting the same OS installation to boot on both the real physical machine and the virtual machine. Most issues relate to the different drivers and configurations required, or to the multitude of boot problems. However, the documents above, and the second one in particular, covered most of what I needed. So if you have a similar setup to me, you should be able to get this working OK by following that second article, with a few small changes suggested below.&lt;br /&gt;&lt;br /&gt;So why did I bother to write this article? Well, not one of the above articles was enough to cover my setup, and I did not find any real help (hints, but not explicit help) for some of the problems I had:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My SATA drives are seen by Ubuntu as SCSI drives, but by Windows as IDE drives, preventing windows from even booting in VMWare without installing the vmscsi drivers *before* booting windows!&lt;/li&gt;&lt;li&gt;Any change I made to the Ubuntu network configuration after setting up vmware completely broke the vmware installation (and made gnome runs super-slow). This seems to be a edgy-feisty problem, and a google search found the solution (add the hostname to 127.0.0.1 in /etc/hosts - simple!)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So, let me outline the basic approach I took to get windows running inside ubuntu. The reverse is possible, and covered in the above articles, but I focused on this approach only.&lt;br /&gt;&lt;br /&gt;My setup:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dell Precision 370 with SATA drives, 2GB RAM, Dell 20" flatscreen (1600x1200)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Windows XP installed on C: (/dev/sda1)&lt;/li&gt;&lt;li&gt;Ubuntu Feisty (7.04) installed on /dev/sda3&lt;/li&gt;&lt;/ul&gt;Installation procedure:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Install the OS's (I think it is best to install windows first, making the C: partition 50% of the space and leaving the rest for Ubuntu, but other routes usually work too).&lt;/li&gt;&lt;li&gt;Make sure dual boot works, disable the timeout in grub so you are always forced to choose the OS (for now) - see article 2 above.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Under linux:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Prepare the disk as in article 2 (see article 1 for more info)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Install vmware-server from the canonical commercial - see article 4 above, or just use: deb http://archive.canonical.com/ubuntu feisty-commercial main&lt;/li&gt;&lt;li&gt;Make a floppy with the windows SCSI drivers from &lt;a href="http://www.vmware.com/download/server/drivers_tools.html"&gt;VMWare&lt;/a&gt; (either write a floppy with dd, or mount the image and copy the files to the windows partition)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Under windows&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Prepare windows as in article 2 above (again article 1 has more info)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Make sure you make the two hardware profiles, and reboot to the new virtual profile for any driver changes.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Also install the vmscsi drivers by running the 'add hardware' wizard of the control panel, and clicking 'no I have not connected the hardware yet' to get windows to allow you to install the scsi drivers even through it cannot see any scsi hardware.&lt;/li&gt;&lt;li&gt;Consider changing the IDE drive as in article 4, although I'm not sure that was really required&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Back in Ubuntu create the virtual machine according to article 2 (and reference article 3 for Ubuntu specifics if you need).&lt;/li&gt;&lt;ul&gt;&lt;li&gt;I recommend choosing the entire disk, not the partitions, as this seems to help a lot with windows/linux/vmware different views of the partition table.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Start the virtual machine as in article 2 and install VMWare tools (which will re-install the scsi drivers, but we needed to do that before this just to get it to boot in the first place).&lt;/li&gt;&lt;li&gt;Prepare the GRUB bootdisk for user-free reboots according to article 2. This is great because you can (mostly), not worry about rebooting to the wrong OS, or having the same OS running on both the hardware and the vmware at the same time (which would be disastrous). There are no solution to having to choose the windows hardware profile, but if you are like me and normally run windows inside linux, then having the virtual profile first, with a timeout, is great because even if you do boot the virtual profile on the real hardware by mistake and mess it up, it is much less serious than messing up the physical machine profile, and you can simply re-create the virtual profile by repeating some of the steps above.&lt;/li&gt;&lt;/ul&gt;Finally, more info on the two problems I had:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The need to install the vmscsi drivers in the windows virtual profile, but with windows booted onto the physical machine, is covered in the discussion above.&lt;/li&gt;&lt;li&gt;The issue with slow-gnome and broken vmware-server is really strange and I do not know the inner reason, but adding the line '127.0.0.1 localhost hostname' to /etc/hosts (with 'hostname' changed to your host), magically solves it. I wonder if the problem is related to the mysterious '127.0.1.1' line in the hosts file?&lt;/li&gt;&lt;/ul&gt;And, last of all, here is the obligatory screenshot showing the ubuntu desktop, with gimp and a gnome game running above the VMWare server console with Windows XP running eclipse showing a Ruby on Rail application with InstantRails windows as well. I know it's weird to be doing ruby and rails development in Windows, but I just happened to get started there, and I like the fact that eclipse on XP has nice compact fonts by default.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_kg7-gho6F0M/RmBIiWFf9_I/AAAAAAAAAoQ/R0njUY8gGDU/s1600-h/ubuntu_vmware.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_kg7-gho6F0M/RmBIiWFf9_I/AAAAAAAAAoQ/R0njUY8gGDU/s400/ubuntu_vmware.png" alt="" id="BLOGGER_PHOTO_ID_5071132935300577266" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-2629664744074925576?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/2629664744074925576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=2629664744074925576' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2629664744074925576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/2629664744074925576'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2007/06/vmware-dual-boot-ubuntu-feisty-and.html' title='VMWare &amp; Dual-Boot Ubuntu Feisty and Windows XP'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_kg7-gho6F0M/RmBIiWFf9_I/AAAAAAAAAoQ/R0njUY8gGDU/s72-c/ubuntu_vmware.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-5902524622077768435</id><published>2007-05-04T08:23:00.000-07:00</published><updated>2008-06-03T02:39:01.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutorials ruby java jruby rails perl'/><title type='text'>Amanzi Snippets</title><content type='html'>&lt;a href="http://snippets.amanzi.org"&gt;&lt;img id="BLOGGER_PHOTO_ID_5060726656345337234" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp1.blogger.com/_kg7-gho6F0M/RjtQFMDQbZI/AAAAAAAAAm4/mxDApK0skaM/s320/dig_ruby.JPG" border="0" /&gt;&lt;/a&gt;Recently I've begun giving a &lt;a href="http://snippets.amanzi.org"&gt;weekly series of ultra-short tech talks&lt;/a&gt; to the other developers in our office. The original problem we had was that, while we were all interested in learning about, or hearing about, technologies outside our working domain, it was generally not possible to spent office working hours on projects not directly of benefit to the company. The solution has been to give 15 minute talks during normal coffee-breaks. One really positive aspect of this is that it forced me to focus on a single specific 'hot' topic, and thereby blocking my usual tendency to lecture on for hours. While the resulting tech-talks are not comprehensive, they were easily digestible. Anyway you can always go to the books referenced below if you want something comprehensive.&lt;br /&gt;These ‘snippets’ follow my progression as I learned Ruby, JRuby and Rails from the books I read, internet articles, and trial-and-error with real scripting projects I did. Each week I thought of something that was of particular interest to me as a Java and sometimes Perl programmer, and presented it in a 2-4 slide ‘snippet’. Where possible I used examples directly relevant to the work we do, which is mostly Java programming of data models and numerical analysis in mobile phone networks (not mobile phones). Sometimes I used examples from the books I read along the way:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.oreilly.com/catalog/beyondjava/"&gt;Beyond Java, Bruce Tate, O’Reilly&lt;/a&gt; – which got me interested in Ruby and Rails&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pragmaticprogrammer.com/titles/ruby/index.html"&gt;Programming Ruby, 2nd Edition, Dave Thomas, Pragmatic Programmers&lt;/a&gt; – which taught me what I needed for me first few scripting projects&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pragmaticprogrammer.com/titles/rails/"&gt;Agile Development with Rails, 2nd Edition, Dave Thomas and David Heinemeier Hansson, Pragmatic Programmers&lt;/a&gt; – which got me finally into Rails, after more than a year of hearing the buzz&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For a more specific Ruby-2-Java comparison, see the extract in &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;articleId=9018460&amp;amp;pageNumber=1"&gt;ComputerWorld&lt;/a&gt; of the book ‘Rails for Java Developers.’ This is a nice soft intro to Ruby for Java developers. However, while my snippets are not as complete, I think they are more interesting and relevant to me, of course. And I hope they will be of interest to others too.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-5902524622077768435?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/5902524622077768435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=5902524622077768435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/5902524622077768435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/5902524622077768435'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2007/05/amanzi-snippets.html' title='Amanzi Snippets'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_kg7-gho6F0M/RjtQFMDQbZI/AAAAAAAAAm4/mxDApK0skaM/s72-c/dig_ruby.JPG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-4668168981644280457</id><published>2007-03-28T02:41:00.000-07:00</published><updated>2007-03-28T02:46:51.342-07:00</updated><title type='text'>Amanzi Down Under</title><content type='html'>&lt;a href="http://bp1.blogger.com/_kg7-gho6F0M/Rgo4-7ReanI/AAAAAAAAAmk/bFeSJjtt2k4/s1600-h/Broome%2B057.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5046908986136095346" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp1.blogger.com/_kg7-gho6F0M/Rgo4-7ReanI/AAAAAAAAAmk/bFeSJjtt2k4/s320/Broome%252B057.jpg" border="0" /&gt;&lt;/a&gt;My other brother and his wife have recently moved to the remote north west of Australia and started &lt;a href="http://amanzidu.blogspot.com"&gt;blogging&lt;/a&gt; from there too. Interesting place. I'd love to visit, but damn it's far away!&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-4668168981644280457?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/4668168981644280457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=4668168981644280457' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4668168981644280457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/4668168981644280457'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2007/03/amanzi-down-under.html' title='Amanzi Down Under'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_kg7-gho6F0M/Rgo4-7ReanI/AAAAAAAAAmk/bFeSJjtt2k4/s72-c/Broome%252B057.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-116317976454942706</id><published>2006-11-10T09:21:00.000-08:00</published><updated>2006-11-10T09:29:24.566-08:00</updated><title type='text'>Bongi</title><content type='html'>This week my brother started his own &lt;a href="http://other-things-amanzi.blogspot.com"&gt;blog about being a surgeon in the notorious Mpumalanga province in South Africa&lt;/a&gt;. Three rich posts in only the first week make my own blog-rate of about 3 a year look rather dismal. Also the content is very interesting, dealing with the hard issues of facing death in an environment that seriously increases the chances of death by violence (read the blog for details!).&lt;br /&gt;&lt;br /&gt;And his text is very well written, to the extent that I'm almost able to ignore the strict lack of capitalization :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-116317976454942706?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/116317976454942706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=116317976454942706' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/116317976454942706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/116317976454942706'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2006/11/bongi.html' title='Bongi'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-116012736659282459</id><published>2006-10-06T02:04:00.000-07:00</published><updated>2006-10-06T08:15:58.106-07:00</updated><title type='text'>Google GapMinder - Wow!</title><content type='html'>I recently read a blog posting by Simon Chapman called simply &lt;a href="http://simonchapman.blogspot.com/2006/05/google-gapminder-beta-2.html"&gt;Google Gapminder Beta 2&lt;/a&gt;. The google application it references, &lt;a href="http://tools.google.com/gapminder/"&gt;Gapminder&lt;/a&gt;, is absolutely fascinating. It is an AJAX style web animation of global human population statistics that are most incredible to observe.&lt;br /&gt;&lt;br /&gt;The original Gapminder data with visualization tools and presentations is available at &lt;a href="http://www.gapminder.org"&gt;http://www.gapminder.org&lt;/a&gt;, but I spent more time running the google animations, and here are a few points I found interesting:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://tools.google.com/gapminder/index.html#ssn=32$majorMode=chart$ds;path=data;type=swf$is;shi=t;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$ts;sp=6;ti=2004$inc_c;gid=1004;by=grp$inc_s;iid=SP%2EPOP%2ETOTL;by=ind$inc_x;iid=IT%2ENET%2EUSER%2EP3;by=ind$inc_y;iid=IT%2ETEL%2ETOTL%2EP3;by=ind$map_x;scale=log;dataMin=0;dataMax=788;sma=520;smi=57$map_y;scale=log;dataMin=0;dataMax=1998;sma=33;smi=386$map_s;scale=sqrt;dataMin=15000;dataMax=1296157000;sma=50;smi=5$inds="&gt;&lt;img alt="phone versus internet" src="http://www.amanzi.com/craig/images/gapminder/Internet_cut.PNG" align="right" /&gt;&lt;/a&gt;Animating &lt;a href="http://tools.google.com/gapminder/index.html#ssn=32$majorMode=chart$ds;path=data;type=swf$is;shi=t;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$ts;sp=6;ti=2004$inc_c;gid=1004;by=grp$inc_s;iid=SP%2EPOP%2ETOTL;by=ind$inc_x;iid=IT%2ENET%2EUSER%2EP3;by=ind$inc_y;iid=IT%2ETEL%2ETOTL%2EP3;by=ind$map_x;scale=log;dataMin=0;dataMax=788;sma=520;smi=57$map_y;scale=log;dataMin=0;dataMax=1998;sma=33;smi=386$map_s;scale=sqrt;dataMin=15000;dataMax=1296157000;sma=50;smi=5$inds="&gt;phone use versus internet use&lt;/a&gt; shows a slow increase of phone use over the last 30 years, with high use countries remaining high, and not much shuffling, and then over the last 15 years internet use races to catch up with phone use, mostly reaching it, with individual countries increasing internet use in growth spurts. Now, in most cases, internet use and phone use are highly correlated, or even matching. In the late 90's, not surprisingly the Scandinavian countries, Sweden, Norway and Finland lead the pack, with the US close on their heels (and the rest of Europe and richer SE Asia a little further back), but over the last 10 years, possibly drive by internet use, the phone use seems to have sped up, with the global distribution narrowing, and all of the wealthier countries crowding up in the maximum penetration area.&lt;/li&gt;&lt;li&gt;&lt;a href="http://tools.google.com/gapminder/index.html#ssn=29$majorMode=chart$ds;path=data;type=swf$is;shi=t;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$ts;sp=6;ti=2004$inc_c;gid=1004;by=grp$inc_s;iid=SP%2EPOP%2ETOTL;by=ind$inc_x;iid=NY%2EGDP%2EPCAP%2EPP%2EKD;by=ind$inc_y;iid=SP%2EDYN%2ELE00%2EIN;by=ind$map_x;scale=log;dataMin=466;dataMax=64299;sma=520;smi=57$map_y;scale=lin;dataMin=24;dataMax=82;sma=33;smi=386$map_s;scale=sqrt;dataMin=15000;dataMax=1296157000;sma=50;smi=5$inds=BWA_tHy,,,,"&gt;&lt;img alt="life expectancy versus income" src="http://www.amanzi.com/craig/images/gapminder/LifeExpectancy_cut.PNG" align="right" /&gt;&lt;/a&gt;Animating &lt;a href="http://tools.google.com/gapminder/index.html#ssn=29$majorMode=chart$ds;path=data;type=swf$is;shi=t;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$ts;sp=6;ti=2004$inc_c;gid=1004;by=grp$inc_s;iid=SP%2EPOP%2ETOTL;by=ind$inc_x;iid=NY%2EGDP%2EPCAP%2EPP%2EKD;by=ind$inc_y;iid=SP%2EDYN%2ELE00%2EIN;by=ind$map_x;scale=log;dataMin=466;dataMax=64299;sma=520;smi=57$map_y;scale=lin;dataMin=24;dataMax=82;sma=33;smi=386$map_s;scale=sqrt;dataMin=15000;dataMax=1296157000;sma=50;smi=5$inds=BWA_tHy,,,,"&gt;income versus life expectancy&lt;/a&gt; is even more amazing. For the first 15 years there is reasonable global correlation, with low income countries having low life expectancy, but in the last 15 years most of Africa has veered severely off that correlation line. Consider Botswana in 1990, with the highest income of continental Africa, sitting right up there with the better off third world countries in Asia and South America, on both income and longevity. Then over the last 15 years, while income continues to increase, the life expectancy drops from 65 to 35 years. This was the most dramatic impact of AIDS I had ever seen. We do not feel this in Europe, but certainly it is horrific in Africa. Both my brothers are doctors in South Africa, where life expectancy dropped from 63 to 45 since 1992. They have often described the severe impact of AIDS on their work, and like most doctors in South Africa are frustrated by the authorities apparent lack of interest in helping the situation.&lt;/li&gt;&lt;li&gt;On the same life-expectancy animation above, you can see &lt;a href="http://tools.google.com/gapminder/index.html#ssn=27$majorMode=chart$ds;path=data;type=swf$is;shi=t;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$ts;sp=6;ti=2004$inc_c;gid=1004;by=grp$inc_s;iid=SP%2EPOP%2ETOTL;by=ind$inc_x;iid=NY%2EGDP%2EPCAP%2EPP%2EKD;by=ind$inc_y;iid=SP%2EDYN%2ELE00%2EIN;by=ind$map_x;scale=log;dataMin=466;dataMax=64299;sma=520;smi=57$map_y;scale=lin;dataMin=24;dataMax=82;sma=33;smi=386$map_s;scale=sqrt;dataMin=15000;dataMax=1296157000;sma=50;smi=5$inds=RWA_tHd,,,,"&gt;Rwanda&lt;/a&gt; hanging around the 45 year mark in the early and mid-80's, but in the late 80's it dramatically drops, to an incredible minimum of 24 years in 1992 due to the civil war (read 'genocide'). This atrocity was so horrific it makes Bosnia look mild, but being in deepest, darkest Africa did not generate the same media coverage as the European conflict did. Since that date, the life expectancy has come back up to 44, but income has slightly reduced (with a big drop in the mid-90's from which it has partly recovered). Africa is surely full of the most amazing, but unfortunately horrific patterns on this gapminder plot.&lt;/li&gt;&lt;li&gt;&lt;a href="http://tools.google.com/gapminder/index.html#ssn=42$majorMode=chart$ds;path=data;type=swf$is;shi=t;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$ts;sp=6;ti=1997$inc_y;iid=SP%2EDYN%2ECONU%2EZS;by=ind$inc_x;iid=SP%2EDYN%2ETFRT%2EIN;by=ind$inc_s;iid=SP%2EPOP%2ETOTL;by=ind$inc_c;gid=1004;by=grp$map_x;scale=lin;dataMin=0.84;dataMax=8.5;sma=520;smi=57$map_y;scale=lin;dataMin=1;dataMax=91;sma=33;smi=386$map_s;scale=sqrt;dataMin=15000;dataMax=1296157000;sma=50;smi=5$inds="&gt;&lt;img alt="contraception versus children" src="http://www.amanzi.com/craig/images/gapminder/Contraception_cut.PNG" align="right" /&gt;&lt;/a&gt;Plotting &lt;a href="http://tools.google.com/gapminder/index.html#ssn=42$majorMode=chart$ds;path=data;type=swf$is;shi=t;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$ts;sp=6;ti=1997$inc_y;iid=SP%2EDYN%2ECONU%2EZS;by=ind$inc_x;iid=SP%2EDYN%2ETFRT%2EIN;by=ind$inc_s;iid=SP%2EPOP%2ETOTL;by=ind$inc_c;gid=1004;by=grp$map_x;scale=lin;dataMin=0.84;dataMax=8.5;sma=520;smi=57$map_y;scale=lin;dataMin=1;dataMax=91;sma=33;smi=386$map_s;scale=sqrt;dataMin=15000;dataMax=1296157000;sma=50;smi=5$inds="&gt;female contraceptive use versus children per woman&lt;/a&gt; is also interesting. Not surprisingly there is a strong correlation, with high contraceptive use linked to fewer children. China sits in a strong position, with a very high level of contraceptive use, peaking at 90% in the mid-90's (and slightly less than 2 children), and most of Africa sits at the other end of the scale, generally below 20% and around 6 children (South Africa is unusual at 56% and 3 children, but still on the correlation curve). One fascinating anomaly is &lt;a href="http://tools.google.com/gapminder/index.html#ssn=45$majorMode=chart$ds;path=data;type=swf$is;shi=t;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$ts;sp=6;ti=1993$inc_y;iid=SP%2EDYN%2ECONU%2EZS;by=ind$inc_x;iid=SP%2EDYN%2ETFRT%2EIN;by=ind$inc_s;iid=SP%2EPOP%2ETOTL;by=ind$inc_c;gid=1004;by=grp$map_x;scale=lin;dataMin=0.84;dataMax=8.5;sma=520;smi=57$map_y;scale=lin;dataMin=1;dataMax=91;sma=33;smi=386$map_s;scale=sqrt;dataMin=15000;dataMax=1296157000;sma=50;smi=5$inds=RUS_tHn,,,,"&gt;Russia&lt;/a&gt;, remaining consistently below the curve, with surprisingly few children considering the low use of contraception. One wonders if there is a cultural aversion to admitting contraceptive use, or perhaps just a low incidence of sex?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Wow! I could spend hours poring over this incredible mine of information. But I better save the rest for another day :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-116012736659282459?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/116012736659282459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=116012736659282459' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/116012736659282459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/116012736659282459'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2006/10/google-gapminder-wow.html' title='Google GapMinder - Wow!'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7497898.post-114365734394902196</id><published>2006-03-29T07:43:00.000-08:00</published><updated>2009-06-26T15:23:50.884-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='management entreprenuer control acquisition finance leadership'/><title type='text'>The perception of control</title><content type='html'>&lt;p&gt;Over the last few years I've begun using the phrase "the perception of control" to describe a phenomenon in company decision making I've seen unpleasantly often. I view it somewhat as a successor to my previous pet phrase "un/informed decision making" and coupled to the phrase "the illusion of efficiency" which I’ve also enjoyed using.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Un/informed decision making&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I'm pleased to say I've spent most of my career working for small startup companies, where necessity requires that decision making is done by the same people that actually do the work. This usually leads to relatively well informed decision making. However, at least once I have worked for a large company that was structured with vertical silos such that decisions were made by managers that usually knew very little about the subject on which they needed to take the decision. Generally they also didn't have the time or inclination to educate themselves, or at least talk to the 'people on the ground' who actually knew something. Take a look at a recent posting on this subject by an IT professional forced to follow IT decisions taken by his IT-illiterate boss: &lt;a href="http://www.infoworld.com/article/06/03/28/76787_14OPrecord_1.html"&gt;When servers crash and burn&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This vertical silo structure has a secondary effect when large companies try to increase efficiency by creating narrow, specialized roles, which leads me to my second phrase:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The illusion of efficiency &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Back in the same large company, I had the rather illuminating experience of being part of a 5 man international team that took 6 months to install a printer. Yes, you heard me right, six months and 4 teleconferences simply to install a printer. This amazing level of extreme inefficiency was the direct result of IT projects designed to increase company operational efficiency through specialization. The point was that if each individual only did one specific task, they would do it faster, perhaps as much as 20% or even 30% faster than someone switching context between several tasks. The end result: IT support was located in Asia, core networking in Germany, Windows domain management in Norway, hardware requisition in Belgium and Project management in Scotland. With business management in California, things could have been even more complicated, but luckily they were only required in one of the meetings. Had we had an onsite IT individual handling all the various IT-related tasks, the project would have taken a couple of hours at most.&lt;br /&gt;&lt;br /&gt;More recently I've been in discussions with my current management on the subject of software development efficiency. They can see that 20% to 30% efficiency gains might be possible through the reuse of software code components across the company product lines. I have argued that any fractional operational cost gains will be offset by dramatically increased time-to-market losses. We're not talking 6 months for a 2 hour project, like my previous example, but we're certainly talking about taking 6 month software projects and scaling them up to years. This problem is nothing new. Software companies have battled with these issues for decades, and many books have been written on the subject. One of the earlier ones is ‘&lt;a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month"&gt;The mythical man-month&lt;/a&gt;’ covering related issues, but more recently the flood of Agile development books, like ‘&lt;a href="http://sphereofinfluence.com/soiblogs/tscheer/archive/2005/09/19/159.aspx"&gt;Lean software development&lt;/a&gt;’, ‘&lt;a href="http://en.wikipedia.org/wiki/Extreme_programming"&gt;Extreme programming&lt;/a&gt;’ and of course the entire ‘&lt;a href="http://www.pragmaticprogrammer.com/bookshelf/index.html"&gt;pragmatic programmer&lt;/a&gt;’ series.&lt;br /&gt;&lt;br /&gt;Drawing from experience I can say that for years I too believed in trying to increase software development costs through increased code re-use, or the sibling concept:- coupling existing software projects together to prevent re-inventing the wheel. However, retrospective analyses of such projects lead me to a few ‘startling’ conclusions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Projects easily became much more complex than initially expected if any one of a few conditions existed:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;more than one pre-existing code-base or product&lt;/li&gt;&lt;li&gt;more than one team of software developers&lt;/li&gt;&lt;li&gt;specification and core development are geographically separated&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Projects intended as ‘prototypes’ or ‘research only’, and as a result were run with small teams with close access to a ‘trial customer’ magically hit much, much tighter deadlines and often with a feature set and level of quality akin to what would have been planned with a ‘real product’ development, but minus much of the heavy project planning.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These observations have made me a natural believer in much of the new &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile development methodology&lt;/a&gt; that is such a hot topic these days. Clearly there is a growing body of software developers that no longer believe in ‘silo’d’ projects with ‘uninformed decision making’ and ‘the illusion of efficiency’ driving project decisions. I’m certainly one of them, but unfortunately many managers are not in agreement. This leads me to the main point of this article:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The perception of control&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;In a small startup company, where there are few people interacting, people generally have a high level of ‘control’ over their environment, colleagues or projects. This is a natural consequence of the fact that any decision maker needs to talk to very few people, if any, to take an “informed decision”. Quite often the decision maker is actually the person that knows the most, and the person that needs to follow through with actions. However, as companies grow, the number of employees increases and jobs become more specialized, decision makers start ending up in the position where they no longer know enough to make an informed decision. Things can go in two ways:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Delegate&lt;/b&gt;. The decision makers entrust aspects of the decision to others who are closer to the data, the customers, or the people on the ground. This requires the ability to trust others, to stick with decisions and to not change the rules of interaction or balance of authority depending on the current political climate. It is a challenging task surprisingly often excelled at by people who are not entrepreneurs, and need to delegate and trust by necessity. Coupled to this is the ability to take blame when necessary, and not look for scapegoats. See this very interesting article on the subject: &lt;a href="http://www.entrepreneur.com/magazine/entrepreneur/2005/march/76294.html"&gt;My Bad!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Dictate&lt;/b&gt;. The decision maker takes the decisions themselves, and maintains total control. This is where the ‘perception of control’ comes into play. No matter how brilliant any leader is, they can only scale so far. Sooner or later a growing company exceeds their ability to maintain genuine control over everything that happens. This is a very common situation for entrepreneurs to end up in. The same strong leadership characteristics that helped that person excel at starting a company and build a new business, often lead to this situation where they cannot successfully delegate. All decisions end up being made based on the dictators ‘perception of control’. They can never have real control because the company has grown beyond that, however their need to feel in control means that they will take decisions based on that feeling, not on real knowledge of the situation.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Paradoxically enough, those that are most dictatorial are exposed soonest and often thrown out by the first controlling VC around the corner, while those that try hardest to do it right and delegate are those that end up maintaining the dictatorial approach for longest. But it cannot last. Dictators are always overthrown. &lt;/p&gt;&lt;p&gt;So, how do you tell the difference between true delegation and dictators operating with the ‘perception of control’? Well it’s not as hard as you might expect. There are a few rather simple things to look for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Middle managers admit that success within the company requires having the ear of the ‘decision makers’ (ie. decisions are made through ‘lobbying’, not informed decision making). I observed this situation once when an external management consultant asked key questions as part of management training, and was somewhat distressed by the answers, even though several of the managers involved did not see the problem (since they did indeed have the ‘ear of the decision maker’).&lt;/li&gt;&lt;li&gt;Strategy decisions are taken in closed meetings, or without the considered input of a reasonable representation of management. This one can be harder to judge, but can show itself through a simply polling of people in the company with the question: do you feel that your opinions are considered in company decision making? Another side to this situation is that the people placed in specific decision making positions end up not having real decision making power, and become mere puppets, which is usually a very unsatisfying role, leading to lack of motivation and often early departure from the company.&lt;/li&gt;&lt;li&gt;The use of &lt;a href="http://en.wikipedia.org/wiki/FUD"&gt;FUD&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;The decision makers are never willing to admit they are wrong: See &lt;a href="http://www.entrepreneur.com/magazine/entrepreneur/2005/march/76294.html"&gt;My Bad!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Individuals that express contrary opinions to the decision makers are removed from positions of influence. When such people are few, this might not be a real sign of a problem, but when this involves a large number of people, you know immediately that it is a major effort to maintain ‘the perception of control’.&lt;/li&gt;&lt;/ul&gt;This last point reminds me of a situation I experienced a few years ago, where the large majority of the people involved in a key project were removed from the project and from positions of influence, in order to kill the project. This drastic level of ‘surgery’ was required because the particular project had substantial internal company support, and a very strong business case. The fallout from that executive decision resulted in the loss of a major customer, the loss of several highly talented employees, and several years of subsequent squabbling within the company as it attempted to deal with the business case, which had simply failed to go away. And all this was done in the name of ‘the perception of control’.&lt;br /&gt;&lt;br /&gt;Clearly the executives taking the decisions did not feel like they had control over that specific project. And that was in fact quite true. But to achieve the nirvana of stable management for the benefit of the company, true delegation is a necessity, complete control an impossibility, and the ‘perception of control’ a destructive middle ground.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7497898-114365734394902196?l=amanzi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amanzi.blogspot.com/feeds/114365734394902196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7497898&amp;postID=114365734394902196' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/114365734394902196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7497898/posts/default/114365734394902196'/><link rel='alternate' type='text/html' href='http://amanzi.blogspot.com/2006/03/perception-of-control.html' title='The perception of control'/><author><name>Craig Taverner</name><uri>http://www.blogger.com/profile/18124952402128625958</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04390862205616151351'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry></feed>