<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9053945</id><updated>2012-01-11T21:29:09.759Z</updated><category term='Python'/><category term='continuous integration'/><category term='PCG'/><category term='java'/><category term='refactoring'/><category term='Category Theory'/><category term='SPA'/><category term='knowledge representation'/><category term='development'/><category term='XPday'/><category term='Hibernate'/><category term='Mind Map'/><category term='change'/><category term='Sknoman'/><category term='unti test'/><category term='SPA jMock'/><category term='python jyton programming'/><category term='VMware CMS drupal appliance'/><category term='Haskell'/><category term='GetInLine'/><category term='TDD'/><category term='agile devlopment'/><category term='AmazonS3'/><category term='unit test'/><category term='VMware'/><category term='FP'/><category term='culture organisation mindtools'/><category term='innovation'/><category term='grumpy old men'/><category term='automated testing'/><category term='RabbitMQ'/><category term='testing'/><category term='Wiki'/><category term='measurement management XPDay'/><category term='test data'/><category term='bulder'/><title type='text'>Agile Application Development: Romilly Cocking's Review</title><subtitle type='html'>Items of interest if you want to adopt, adapt, apply and improve Agile Development Processes.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>75</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9053945.post-7771265941294236248</id><published>2011-11-30T09:35:00.001Z</published><updated>2011-11-30T09:44:52.790Z</updated><title type='text'>Comfort for Application Developers from Tom de Marco</title><content type='html'>Thanks to a tweet from @flowchainsensei, I've just been enjoying an e&lt;a href="http://www.computer.org/cms/Computer.org/ComputingNow/homepage/2011/1111/W_SW_AllLateProjectsAretheSame.pdf"&gt;xcellent article by Tom de Marco&lt;/a&gt;. It's well worth a read; I took away two key thoughts.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Developing software is much harder than developing hardware&lt;/li&gt;&lt;li&gt;Software developers spend much of their life&amp;nbsp;feeling&amp;nbsp;bad about late delivery when it's usually not their fault.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;To put his core conclusion another way, most software projects are a waste of effort. They have such low marginal&amp;nbsp;utility&amp;nbsp;that they are doomed never to show a return for the&amp;nbsp;organisation&amp;nbsp;that funds them. If we just didn't do them the world would be better off.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, we'd need to find work for the ex-developers. &amp;nbsp;Maybe they could learn to teach. We could certainly use a few more skilled IT teachers.&lt;/div&gt;&lt;div&gt;&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/9053945-7771265941294236248?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7771265941294236248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7771265941294236248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7771265941294236248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7771265941294236248'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/11/comfort-for-application-developers-from.html' title='Comfort for Application Developers from Tom de Marco'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-4827720142040340411</id><published>2011-11-04T17:12:00.000Z</published><updated>2011-11-04T17:12:14.796Z</updated><title type='text'>I2C on the Beagleboard xM</title><content type='html'>It's really easy driving I2C™ devices from the Beagleboard. I'm using the &lt;a href="http://www.tincantools.com/product.php?productid=16151&amp;amp;cat=249&amp;amp;page=1"&gt;Trainer-xM from tincantools&lt;/a&gt;; that takes care of shifting voltage levels from the 1.8v used by the Beagleboard to the 5v levels that my I2C boards expect.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are a few I2C coding examples on the web; since my BB image includes python and geany, I've written the I2C code in Python and can edit and test it on the board. Much faster than an edit-compile-upload-test cycle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's the code:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;import i2c, time&lt;br /&gt;&lt;br /&gt;extender = i2c.I2C_device(0x20)&lt;br /&gt;extender.begin_transmission()&lt;br /&gt;extender.send(chr(0))&lt;br /&gt;time.sleep(5)&lt;br /&gt;for count in range(0, 16):&lt;br /&gt;    extender.send(chr(count))&lt;br /&gt;    time.sleep(0.5)&lt;br /&gt;extender.end_transmission()&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=FSQGY9qhuPA"&gt;See it running.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-4827720142040340411?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/4827720142040340411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=4827720142040340411' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4827720142040340411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4827720142040340411'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/11/i2c-on-beagleboard-xm.html' title='I2C on the Beagleboard xM'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-171130817967266112</id><published>2011-11-03T17:15:00.001Z</published><updated>2011-11-03T17:15:38.371Z</updated><title type='text'>From little Acorns do great Raspberries grow</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-9HduwFw_xVU/TrLKkMZ78nI/AAAAAAAAAJ8/BP7S-ka454k/s1600/DSCN1101.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="149" src="http://2.bp.blogspot.com/-9HduwFw_xVU/TrLKkMZ78nI/AAAAAAAAAJ8/BP7S-ka454k/s200/DSCN1101.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;I recently re-discovered an old friend: the great-great-grandfather of the ARM-based &lt;a href="http://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt; . It's the original &lt;a href="http://en.wikipedia.org/wiki/Acorn_System_1"&gt;Acorn micro-computer&lt;/a&gt; (ca. 1979). Acorn went to on make a succession of machines, including the BBC Micro and the Archimedes.&lt;br /&gt;&lt;br /&gt;The Archimedes was based on a proprietary RISC chip which is the grandfather of today's ARM chips. The Raspberry Pi is part-funded by Dave Braben, who wrote &lt;a href="http://en.wikipedia.org/wiki/Elite_(video_game)"&gt;Elite&lt;/a&gt; (arguably the most famous BBC micro game). &lt;a href="http://www.broadcom.com/"&gt;Broadcom&lt;/a&gt;, who are make the Pi's ARM chip, have strong historic links with Acorn.&lt;br /&gt;&lt;br /&gt;I'll try the micro out in a day or two; I still have the (fairly minimal) original documentation, and there is more information on Wikipedia. The micro was arguably one of the best investments made by Cocking and Drury; my colleague Jonathan Barman used it to learn assembler, and went on to master 370 Assembler, through which he landed us a major contract with a national brewery.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-171130817967266112?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/171130817967266112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=171130817967266112' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/171130817967266112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/171130817967266112'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/11/from-little-acorns-do-great-raspberries.html' title='From little Acorns do great Raspberries grow'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-9HduwFw_xVU/TrLKkMZ78nI/AAAAAAAAAJ8/BP7S-ka454k/s72-c/DSCN1101.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-5119834062577175318</id><published>2011-10-15T11:53:00.000+01:00</published><updated>2011-10-15T11:53:54.079+01:00</updated><title type='text'>Blogging from the Beagleboard</title><content type='html'>I'm posting this using the Midori browser running under a custom Angstrom image on my brand-new Beagleboard Xm. The Beagleboard continues to amaze me.&lt;br /&gt;&lt;br /&gt;Setting up a fresh sd card with a custom image has proved a little tricky; it's taken about 4 hours, of which one was spent waiting for a very slow Kingston microSD card to get configured on first boot. I'll write up the process and post it later this weekend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-5119834062577175318?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/5119834062577175318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=5119834062577175318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5119834062577175318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5119834062577175318'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/10/blogging-from-beagleboard.html' title='Blogging from the Beagleboard'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-738721130983108978</id><published>2011-10-13T16:43:00.001+01:00</published><updated>2011-10-13T16:43:59.438+01:00</updated><title type='text'>Busy with the BeagleBoard</title><content type='html'>Yesterday I decided that the time had come to get to grips with embedded Linux. I ordered a &lt;a href="http://beagleboard.org/"&gt;BeagleBoard Xm&lt;/a&gt;&amp;nbsp;from &lt;a href="http://uk.farnell.com/texas-instruments/beagle-xm/kit-dev-beagleboard-xm-omap35x/dp/1823269?CMP=KNC-GUK-FUK-GEN-SUP-OSP&amp;amp;s_kwcid=TC|13123|%2Bbeagle%20%2Bboard||S|b|8398950069"&gt;Farnell,&lt;/a&gt; a suitable &lt;a href="http://www.maplin.co.uk/ac-dc-fixed-voltage-switched-mode-power-supplies-48484"&gt;wall-wart from Maplin&lt;/a&gt;, and started counting the hours until they arrived.&lt;br /&gt;&lt;br /&gt;Both turned up this morning and my brand new BeagleBoard is up and running. My biggest worry was the possibility of blowing the board by connecting the power supply the wrong way round; maybe the manual tells you about the required polarity of the power plug, but I couldn't find the information anywhere. As usual, Google was my friend; it turns out that the board requires a centre-positive, earthed shield plug. The Maplin PSU is configurable, but &lt;b&gt;the required polarity is the opposite of what the Maplin markings suggest is the norm&lt;/b&gt;. I strongly advise you to check the polarity of the plug with a multi-meter before you plug it into your precious BeagleBoard.&lt;br /&gt;&lt;br /&gt;I'm still waiting for a couple of microSD cards; Argos has them at at three times the price I paid on Amazon, and for now I'm happy playing with the test distribution which comes with the kit.&lt;br /&gt;&lt;br /&gt;The test distribution is a usable version of Angstrom. I followed the great getting started guide on IBM developerworks. It's helpful, but a little out-of-date; it suggests that the test distro is ram-disk based and loses changes to the filesystem on re-boot, but that's not the case. I took the screenshot shown below during my first session and it was still sitting on my desktop when I rebooted.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ti_QnpMUvzY/Tpb8HJMLcvI/AAAAAAAAAJs/hOBsDMuOsbc/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://2.bp.blogspot.com/-ti_QnpMUvzY/Tpb8HJMLcvI/AAAAAAAAAJs/hOBsDMuOsbc/s400/Screenshot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you can see from the screenshot, the distro comes with a lightweight but functional web browser and many of the tools you'd expect to find in a desktop environment. It doesn't come with the nano editor; perhaps I'll finally get to grips with vi. (Doh. It's got gedit. I can stay a mouseman). It does&amp;nbsp;include Python, which makes me very happy.&lt;br /&gt;&lt;br /&gt;I started writing this post while the distro was updating. It's now finished.&lt;br /&gt;&lt;br /&gt;This inexpensive board has much, much more computing power than the Atlas - a supercomputer I programmed in the late 60s. When the first Atlas was commissioned, people said that the UK's computer power doubled overnight.&lt;br /&gt;&lt;br /&gt;I'm looking forward to a couple of months' happy &lt;strike&gt;play&lt;/strike&gt; research with the BeagleBoard - and by then, with any luck, I'll be able to play with a &lt;a href="http://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-738721130983108978?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/738721130983108978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=738721130983108978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/738721130983108978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/738721130983108978'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/10/busy-with-beagleboard.html' title='Busy with the BeagleBoard'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ti_QnpMUvzY/Tpb8HJMLcvI/AAAAAAAAAJs/hOBsDMuOsbc/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-9114603927830568866</id><published>2011-09-17T21:36:00.000+01:00</published><updated>2011-09-17T21:36:55.914+01:00</updated><title type='text'>VMWare: how to lose a customer in one easy lesson</title><content type='html'>A while ago, when I was developing a lot of courseware, I got hooked on virtualisation. Virtual Machines are a great way to create a repeatable course environment, and if your course is Linux-based you can distribute the course images freely. I started off using VMWare; their Windows workstation was inexpensive, and their player was free.&lt;br /&gt;&lt;br /&gt;I stuck with VMWare for years, and used it for more and more applications. In the good old days, when Dell were after market share rather than margin, I picked up a couple of servers for about £250 each - dual-core machines with 4Gb of ram and decent hard drives. I ran Ubuntu on them, and used VMWare Server to host several virtual machines.&lt;br /&gt;&lt;br /&gt;All worked fine until VMWare announced that &amp;nbsp;Server had reached end-of-life, and their remote desktop stopped working with current browsers. I found myself with a set of unusable VMs which represented many weeks of development and configuration.&lt;br /&gt;&lt;br /&gt;At the time I was working on a contract a few desks away from &lt;a href="http://www.linkedin.com/in/stuartervine"&gt;Stuart Ervine&lt;/a&gt;, and he suggested I try&amp;nbsp;&lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;. It's proved to be a more-than-adequate replacement for VMWare, who won't be getting business from me or the clients I advise in future. Of course VMWare were within their rights to end-of-life a free product, but they caused me enough grief to destroy six years of brand loyalty at a stroke.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-9114603927830568866?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/9114603927830568866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=9114603927830568866' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/9114603927830568866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/9114603927830568866'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/09/vmware-how-to-lose-customer-in-one-easy.html' title='VMWare: how to lose a customer in one easy lesson'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-575784268582434167</id><published>2011-09-17T11:47:00.001+01:00</published><updated>2011-09-17T11:49:27.966+01:00</updated><title type='text'>Leiningen and Eclipse</title><content type='html'>I'm now fairly comfortable with leiningen, though I still feel a frisson of anxiety whenever I run it. I know that Maven is lurking there somewhere, and my experiences with Maven have not been happy.&lt;br /&gt;&lt;br /&gt;I'm also a bit leery of letting lein download and install arbitrary software from external sources. I'll need to set up a local repository, which will mean a closer brush with Maven that I've had before.&lt;br /&gt;&lt;br /&gt;It's annoying, but seems unavoidable. Clojure libraries and tutorials generally assume that you're using leiningen.&lt;br /&gt;&lt;br /&gt;At least the lein/Eclipse combo makes it simple to create and populate an Eclipse Clojure project.&lt;br /&gt;&lt;br /&gt;Here's what you do:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In the directory in which &amp;nbsp;you want to create your project, run&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;lein new &lt;project-name&gt;&lt;/project-name&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;to the newly-created &lt;project-name&gt; directory&lt;/project-name&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;open&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; project.clj&lt;/span&gt; in your text editor of choice&lt;/li&gt;&lt;li&gt;add&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;:dev-dependencies [[lein-eclipse "1.0.0"]]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;save the file&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;run &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;lein deps&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;run&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; lein eclipse&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;import your newly-created project into eclipse&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;At the end of stage 4, your project.clj file should look like this&lt;/div&gt;&lt;pre&gt;(defproject hadoop-spike "1.0.0-SNAPSHOT"&lt;br /&gt;&amp;nbsp; :description "FIXME: write description"&lt;br /&gt;&amp;nbsp; :dependencies [[org.clojure/clojure "1.2.1"]]&lt;br /&gt;&amp;nbsp; :dev-dependencies [[lein-eclipse "1.0.0"]])&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-575784268582434167?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/575784268582434167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=575784268582434167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/575784268582434167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/575784268582434167'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/09/lein-development.html' title='Leiningen and Eclipse'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-4226314587699044562</id><published>2011-09-17T11:31:00.000+01:00</published><updated>2011-09-17T11:31:06.011+01:00</updated><title type='text'>WabbitMQ runs too</title><content type='html'>Off to a good start this morning;I set up a Clojure spike using &lt;a href="https://github.com/mefesto/wabbitmq"&gt;WabbitMQ&lt;/a&gt;&amp;nbsp;and got a simple test running in a few minutes. Now I can link up my Python and Clojure components. Eeeeeeeexcelent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-4226314587699044562?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/4226314587699044562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=4226314587699044562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4226314587699044562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4226314587699044562'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/09/wabbitmq-runs-too.html' title='WabbitMQ runs too'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-6225588183420985482</id><published>2011-09-15T15:38:00.000+01:00</published><updated>2011-09-15T15:38:02.918+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sknoman'/><category scheme='http://www.blogger.com/atom/ns#' term='RabbitMQ'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Run, RabbitMQ, run Rabbit, run, run, run</title><content type='html'>I'm about to do some more work on Sknoman (a personal knowledge management application) and need to link together several disparate subsystems. Some are written in Python, but I'm developing one in clojure.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.natpryce.com/"&gt;Nat Pryce&lt;/a&gt; speaks highly of &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt;, so I decided to give it a try.&lt;br /&gt;&lt;br /&gt;For reasons too boring to explain, I'm developing on a Ubuntu Lucid virtual machine. Lucid is almost as old as I am, so the packaged version of RabbitMQ is seriously out-of-date.&lt;br /&gt;&lt;br /&gt;Once I'd installed an up-to-date version from the &lt;a href="http://www.rabbitmq.com/debian.html#apt"&gt;RabbitMQ Debian repo&lt;/a&gt;, I had the RabbitMQ &lt;a href="http://www.rabbitmq.com/tutorials/tutorial-one-python.html"&gt;Python send/receive example&lt;/a&gt; running in about five minutes. While that's hardly an exhaustive test, it's very reassuring.&lt;br /&gt;&lt;br /&gt;I'll be trying a Clojure client next, but I'm hoping this is going to be painless.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-6225588183420985482?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/6225588183420985482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=6225588183420985482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6225588183420985482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6225588183420985482'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/09/run-rabbitmq-run-rabbit-run-run-run.html' title='Run, RabbitMQ, run Rabbit, run, run, run'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-8626387164227864667</id><published>2011-02-11T08:37:00.000Z</published><updated>2011-02-11T08:37:58.315Z</updated><title type='text'>PrecisionIR - great service, terrible software</title><content type='html'>&lt;h2&gt;PrecisionIR - how &lt;i&gt;not &lt;/i&gt;to run a service&lt;/h2&gt;&lt;br /&gt;I've been using the free annual reports service provided by PrecisionIR. It's a great service; you can get hundreds - no, thousands - of free annual reports and daily updates about the companies that you are interested in.&lt;br /&gt;&lt;br /&gt;Twice now PrecisionIR has emailed me a survey abut their service. They say it's a short survey, and it is.&amp;nbsp; Each time it's crashed on the second response.&lt;br /&gt;&lt;br /&gt;The second time it happened I decided follow the advice in the error page and email support at PrecisionIR. The email bounced.&lt;br /&gt;&lt;br /&gt;I guess they don't do a lot of testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-8626387164227864667?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/8626387164227864667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=8626387164227864667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8626387164227864667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8626387164227864667'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2011/02/precisionir-great-service-terrible.html' title='PrecisionIR - great service, terrible software'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-6701431846872953679</id><published>2010-09-03T08:20:00.000+01:00</published><updated>2010-09-03T08:20:06.722+01:00</updated><title type='text'>Catching the train in J</title><content type='html'>My mini array engine in Clojure is coming on apace, and another day should give me the functionality I want to right now.&lt;br /&gt;&lt;br /&gt;I've been checking my specification against the behaviour of &lt;a href="http://www.jsoftware.com/"&gt;J&lt;/a&gt;, and this has had an interesting side effect.&lt;br /&gt;&lt;br /&gt;I've tried to learn J several times. Each time I quickly mastered the basics but then hit a brick wall in understanding.&lt;br /&gt;&lt;br /&gt;This time around the wall has collapsed.&lt;br /&gt;&lt;br /&gt;The concept I was missing was that of a &lt;i&gt;train of verbs&lt;/i&gt;. A verb in J is another name for a function. A train is an isolated sequence of verbs. For some reason I couldn't grasp why these were needed or how they worked, but now the need and its solution seem obvious. As a result I can read (and write) programs in J which previously eluded me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-6701431846872953679?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/6701431846872953679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=6701431846872953679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6701431846872953679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6701431846872953679'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2010/09/catching-train-in-j.html' title='Catching the train in J'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-623145959080648627</id><published>2010-09-01T10:51:00.000+01:00</published><updated>2010-09-01T10:51:07.765+01:00</updated><title type='text'>Old habits die hard, if ever</title><content type='html'>I've taken a bit of a break from electronics, and have been having great fun with Clojure.&lt;br /&gt;&lt;br /&gt;In the distant past I spent about 19 years programming in a (fairly) functional programming language, so Closure feels very comfortable. The thing I miss most is a Romilly-friendly multi-dimensional array library.&lt;br /&gt;&lt;br /&gt;There are high-performance numeric libraries in Java, and some of them have been wrapped in Clojure, but their authors don't think the way I do.What I want is a library that works like the array engines in APL or J wrapped in a Clojure API.&lt;br /&gt;&lt;br /&gt;For now I value expressiveness more than performance, and it looks as if I can implement a useful subset of APL primitives in a couple of days.&lt;br /&gt;&lt;br /&gt;When performance becomes an issue there are two tempting possibilities. Closure allows you to use native Java arrays performantly; and a Clojure wrapper for OpenGL looks as if it may allow easy access to a workstation's GPU. This might permit array operations that run faster than they would in Java or C++.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-623145959080648627?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/623145959080648627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=623145959080648627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/623145959080648627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/623145959080648627'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2010/09/old-habits-die-hard-if-ever.html' title='Old habits die hard, if ever'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-5681841453460049486</id><published>2010-04-27T10:53:00.001+01:00</published><updated>2010-04-27T10:55:30.604+01:00</updated><title type='text'>This blog has moved</title><content type='html'>&lt;br /&gt;       This blog is now located at http://romillycocking.blogspot.com/.&lt;br /&gt;       You will be automatically redirected in 30 seconds or you may click &lt;a href='http://romillycocking.blogspot.com/'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;       For feed subscribers, please update your feed subscriptions to&lt;br /&gt;       http://romillycocking.blogspot.com/feeds/posts/default.&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-5681841453460049486?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://romillycocking.blogspot.com/' title='This blog has moved'/><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/5681841453460049486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=5681841453460049486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5681841453460049486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5681841453460049486'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2010/04/this-blog-has-moved.html' title='This blog has moved'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-7790623298590527822</id><published>2009-09-28T11:19:00.002+01:00</published><updated>2009-09-28T11:23:49.096+01:00</updated><title type='text'>Host your own Windows7 launch party?</title><content type='html'>At a loose end? Why not host your own Windows7 launch party? &lt;a href="http://www.youtube.com/watch?v=1cX4t5-YpHQ"&gt;Here's how.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks to Neil Hume of &lt;a href="http://ftalphaville.ft.com/"&gt;FT Alphaville&lt;/a&gt; for this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-7790623298590527822?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7790623298590527822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7790623298590527822' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7790623298590527822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7790623298590527822'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/09/host-your-own-windows7-launch-party.html' title='Host your own Windows7 launch party?'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-5808015171412922314</id><published>2009-07-05T11:17:00.002+01:00</published><updated>2009-07-05T11:21:00.548+01:00</updated><title type='text'>What shall we do with Gordon Brown?</title><content type='html'>Moonwalker Buzz Aldrin says a &lt;a href="http://news.bbc.co.uk/1/hi/programmes/newsnight/8131706.stm"&gt;global leader should commit to sending a man to Mars&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Go for it, President Obama. And may I suggest Gordon Brown as the lucky spacefarer?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-5808015171412922314?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/5808015171412922314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=5808015171412922314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5808015171412922314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5808015171412922314'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/07/what-shall-we-do-with-gordon-brown.html' title='What shall we do with Gordon Brown?'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-1054300693843550387</id><published>2009-06-15T18:05:00.002+01:00</published><updated>2009-06-15T18:15:47.866+01:00</updated><title type='text'>IBM says world will drown in data next year</title><content type='html'>According to &lt;a href="http://www-05.ibm.com/uk/smarterplanet/opinions/intelligence/index.html?ca=neiotuk_smart_planet-20090128&amp;amp;me=w&amp;amp;met=opinions&amp;amp;re=gateway&amp;amp;s_tact=&amp;amp;cm_mmc=-_-s-_-opinions-gateway-_-neiotuk_smart_planet-20090128"&gt;IBM&lt;/a&gt;, "Experts predict that by 2010, the amount of digital information will double every 11 hours."&lt;br /&gt;&lt;br /&gt;That's really, really scary. If the amount of data were to double every 11 hours, it would quadruple every day. Over a month the quantity of data would increase by a factor of 36,893,488,147,419,103,232 (roughly speaking). Over a year it would increase by a factor of ...&lt;br /&gt;&lt;br /&gt;No, I'm not going to work it out. But if anyone from IBM reads this please can you buy a calculator for the marketing department.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-1054300693843550387?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/1054300693843550387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=1054300693843550387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/1054300693843550387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/1054300693843550387'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/06/ibm-says-world-will-drown-in-data-next.html' title='IBM says world will drown in data next year'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-7296358720723028021</id><published>2009-06-13T08:03:00.003+01:00</published><updated>2009-06-13T08:08:12.356+01:00</updated><title type='text'>Element 112 needs a name</title><content type='html'>A German team is &lt;a href="http://news.bbc.co.uk/1/hi/sci/tech/8093374.stm"&gt;looking for a name&lt;/a&gt; for an element that's just about to join the periodic table.&lt;br /&gt;&lt;br /&gt;Element 112 is super-heavy and very unstable. It falls apart in milliSeconds.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Gordonium&lt;/span&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-7296358720723028021?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7296358720723028021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7296358720723028021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7296358720723028021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7296358720723028021'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/06/element-112-needs-name.html' title='Element 112 needs a name'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-3225921778938015092</id><published>2009-03-06T07:34:00.004Z</published><updated>2009-03-06T08:10:32.347Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated testing'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Oh, the Coder and the Tester can be Friends, can be Friends...</title><content type='html'>(with apologies to &lt;a href="http://en.wikipedia.org/wiki/Oklahoma%21"&gt;&lt;span style="font-style: italic;"&gt;Oklahoma!&lt;/span&gt;&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://testobsessed.com/"&gt;Elisabeth Hendrickson&lt;/a&gt; just tweeted about a &lt;a href="http://www.developsense.com/2009/03/50-deployments-day-and-perpetual-beta.html"&gt;thought-provoking analysis&lt;/a&gt; by Michael Bolton of the much-vaunted Continuous Deployment at &lt;a href="http://www.imvu.com/"&gt;IMVU&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm a big fan of TDD, Automated Tests and Continuous Integration, but I'd hate to develop without help from good Testers. A couple of years ago I worked on a dream project; a very small, highly skilled team which included a couple of developers, a tester and a business analyst. We were pair-programming, and my pairs came from a pool that included some of the best agile developers in the UK. The Tester and Business Analyst were also outstanding.&lt;br /&gt;&lt;br /&gt;Our defect rate was very low: five defects in UAT, none in production over a twelve-month period. There's no doubt that this was a team effort; the Tester and  the BA both caught many defects that were caused by problems we developers hadn't though of, and therefore never tested for. Equally, the developers tested so thoroughly that the Tester and BA could focus on the hard stuff, where their skills contributed maximum value.&lt;br /&gt;&lt;br /&gt;For reasons that need not concern us, the application initially went into production on a machine that was controlled by the developers. We &lt;span style="font-style: italic;"&gt;could&lt;/span&gt; have done continuous deployment, but we didn't. We  always asked our Tester to do a final check-through on our staging box; mostly he found nothing, but once or twice he found defects that would have been real embarrasments in production. Of course, that wasn't his only contribution; our acceptance tests were the product of very close collaboration by the whole team.&lt;br /&gt;&lt;br /&gt;So it was no surprise to read to read about Michael Bolton's experience when he did some manual testing of the IMVU site. &lt;a href="http://timothyfitz.wordpress.com/2009/02/10/continuous-deployment-at-imvu-doing-the-impossible-fifty-times-a-day/"&gt;IMVU practise Continuous Deployment&lt;/a&gt;, and claim to rely entirely on Automated Tests. Read Bolton's &lt;a href="http://www.developsense.com/2009/03/50-deployments-day-and-perpetual-beta.html"&gt;50 Deployments A Day and The Perpetual Beta&lt;/a&gt; and see the consequences.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-3225921778938015092?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/3225921778938015092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=3225921778938015092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/3225921778938015092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/3225921778938015092'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/03/oh-coder-and-tester-can-be-friends-can.html' title='Oh, the Coder and the Tester can be Friends, can be Friends...'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-6043049723061059510</id><published>2009-03-01T08:30:00.003Z</published><updated>2009-03-01T08:52:00.753Z</updated><title type='text'>EtherPad - real-time collaborative text editing</title><content type='html'>A tweet from &lt;a href="http://twitter.com/ericmack"&gt;Eric Mack&lt;/a&gt; just pointed me at &lt;a href="http://etherpad.com/"&gt;EtherPad&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's a free tool for real-time collaborative text editing. As Eric says, it's simple, and it just works.&lt;br /&gt;&lt;br /&gt;If two or more of you need to collaborate over the web in real-time on a text document, this is all you need.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-6043049723061059510?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/6043049723061059510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=6043049723061059510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6043049723061059510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6043049723061059510'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/03/etherpad-real-time-collaborative-text.html' title='EtherPad - real-time collaborative text editing'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-7882741262669903510</id><published>2009-02-28T11:38:00.013Z</published><updated>2009-03-01T09:53:27.646Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Refactoring is much easier...</title><content type='html'>Refactoring is much easier when you have clearly expressed intent.&lt;br /&gt;&lt;br /&gt;This came up a few days ago when I was talking with &lt;a href="http://www.m3p.co.uk/blog/" target="_blank"&gt;Steve&lt;/a&gt; and &lt;a href="http://www.natpryce.com/" target="_blank"&gt;Nat&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We were holding a lunchtime retrospective about the latest delivery of &lt;a href="http://www.musketeer-labs.com/"&gt;our TDD course&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We talked about what had worked well, what we could do differently, and how we could customise the course for audiences with differing requirements.&lt;br /&gt;&lt;br /&gt;Nat and Steve were keen to develop an exercise that would focus on refactoring. I liked the idea but I also wanted to keep an existing exercise which brings to life the value of intentional programming.&lt;br /&gt;&lt;br /&gt;I felt that the ability to express intent was even more fundamental than the skill of refactoring.&lt;br /&gt;&lt;br /&gt;It's risky to refactor unless you can check whether the code still does what is wanted. I don't think you can do that easily unless the tests and code express intention.&lt;br /&gt;&lt;br /&gt;Nat reminded me that what you express, and how you express it, is different in code and tests. Good tests remind you of intent when they fail. This makes it easier to diagnose the cause of failure.&lt;br /&gt;&lt;br /&gt;Refactoring  is easiest with clean code, and clean code expresses clear intent. (Of course, as Steve pointed out, &lt;span style="font-style: italic;"&gt;everything&lt;/span&gt; is easier if you have clean code).&lt;br /&gt;&lt;br /&gt;You might refactor &lt;span style="font-style: italic;"&gt;because &lt;/span&gt;the intent is not clear, but there are other reasons to do so. For example,  you might refactor in order to make the code easier to change.&lt;br /&gt;&lt;blockquote&gt;"The ability to pay back debt...depends on you writing code that is clean enough to be able to refactor as you come to understand your problem"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://c2.com/%7Eward/" target="_blank"&gt;Ward Cunningham&lt;/a&gt; - &lt;a href="http://www.youtube.com/watch?v=pqeJFYwnkjE" target="_blank"&gt;Debt&lt;/a&gt;&lt;/blockquote&gt; Conclusion: we will develop a module on refactoring, but we'll keep our emphasis on writing clean code and tests that clearly express intent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-7882741262669903510?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7882741262669903510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7882741262669903510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7882741262669903510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7882741262669903510'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/02/refactoring-is-much-easier.html' title='Refactoring is much easier...'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-6047899155927571144</id><published>2009-02-27T14:07:00.004Z</published><updated>2009-02-27T14:34:16.466Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='GetInLine'/><category scheme='http://www.blogger.com/atom/ns#' term='SPA jMock'/><category scheme='http://www.blogger.com/atom/ns#' term='unit test'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>GetInLine version 2</title><content type='html'>I'm currently working on GetInLine 2 - a complete rewrite of &lt;a href="http://sourceforge.net/projects/getinline"&gt;GetInLine&lt;/a&gt;, a record-processing DSL I wrote a couple of years ago.&lt;br /&gt;&lt;br /&gt;The DSL is not yet as fluent as I would like, but I'm much happier with the underlying design. I'll also be switching to an Apache license; &lt;a href="http://macstrac.blogspot.com/"&gt;James Strachan&lt;/a&gt; encouraged me to do this for version 1, but I never got round to it.&lt;br /&gt;&lt;br /&gt;I'm following the development approach that &lt;a href="http://www.m3p.co.uk/blog/"&gt;Steve Freeman&lt;/a&gt; and &lt;a href="http://www.natpryce.com/"&gt;Nat Pryce&lt;/a&gt; advocate in &lt;a href="http://www.mockobjects.com/book/"&gt;their book&lt;/a&gt; (and which the three of us expound in &lt;a href="http://www.mockobjects.com/2008/05/learn-from-source.html"&gt;our TDD course&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I started with a failing end-to-end test. Then I used mocks and unit tests to help me to pull the required interfaces into existence, filling out the application until the first end-to-end test passed.&lt;br /&gt;&lt;br /&gt;The resulting code is much simpler to test and write than v1 was, and I've ended up with a highly pluggable set of components.&lt;br /&gt;&lt;br /&gt;I'll post a URL as soon as GIL2 is ready for beta testing; if anyone wants to tale a look before then, let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-6047899155927571144?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/6047899155927571144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=6047899155927571144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6047899155927571144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6047899155927571144'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/02/getinline-version-2.html' title='GetInLine version 2'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-4343786923205096777</id><published>2009-02-11T10:41:00.003Z</published><updated>2009-02-11T10:56:01.007Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='PCG'/><category scheme='http://www.blogger.com/atom/ns#' term='grumpy old men'/><title type='text'>Opportunism knocks</title><content type='html'>I've just angrily binned an invitation from the Professional Conractors' Guild.&lt;br /&gt;&lt;br /&gt;I'm a PCG member, and I've been very happy with them. If you, like me, work as an IT contractor in the UK you'll find they offer an excellent and valuable range of services. I routinely recommend them to colleagues. So -what did they do to annoy me?&lt;br /&gt;&lt;br /&gt;They invited me to their tenth birthday celebration.&lt;br /&gt;&lt;br /&gt;For which I would have had to don a DJ and pay them £60.&lt;br /&gt;&lt;br /&gt;Why on earth would they think I'd want to do that?&lt;br /&gt;&lt;br /&gt;I'm glad they have been going for a while, but not glad enough to fork out £60. Even worse, I'd have to spend the evening talking to other IT contractors - and we'd all be wearing &lt;span style="font-style: italic;"&gt;dinner jackets&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;If the economy had been booming I'd just have tossed the invitation in the bin, but with things as they are the invitation was about as welcome as an invitation to play a round of golf with Fred the Shred. (I assume he plays golf, on the grounds that he must be good at &lt;span style="font-style: italic;"&gt;something&lt;/span&gt;.)&lt;br /&gt;&lt;br /&gt;So, PCG: I won't be joining in your narcissistic celebration, and please don't waste my membership fees on promoting events like this in future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-4343786923205096777?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/4343786923205096777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=4343786923205096777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4343786923205096777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4343786923205096777'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/02/opportunism-knocks.html' title='Opportunism knocks'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-4529131539222670740</id><published>2009-02-07T14:15:00.005Z</published><updated>2009-02-07T14:51:34.038Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='XPday'/><category scheme='http://www.blogger.com/atom/ns#' term='agile devlopment'/><title type='text'>Read "Rocks into Gold" and spread the word!</title><content type='html'>I've just read Clarke Ching's &lt;a href="http://www.slideshare.net/cching/rocks-into-gold-by-clarke-ching-presentation"&gt;Rock's into Gold&lt;/a&gt; on SlideShare. It's a delightful short story which explains how incremental delivery can improve cash flow, saving jobs in the process.&lt;br /&gt;&lt;br /&gt;I first met Clarke at &lt;a href="http://www.xpday.org/"&gt;XP Day&lt;/a&gt; a couple of years ago. Several friends told me how much they liked his &lt;a href="http://xpday5.xpday.org/sessions.php#IntroductionToAgile"&gt;Introduction to Agile Development&lt;/a&gt;, so I went along. I'm glad I did.&lt;br /&gt;&lt;br /&gt;Clarke's presentation was excellent - clear, simple, business focussed, and very compelling. So's &lt;span style="font-style: italic;"&gt;Rocks Into Gold&lt;/span&gt;. I've started to use it as a resource for prospective agile adopters; I may even save a few jobs!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.slideshare.net/cching/rocks-into-gold-by-clarke-ching-presentation"&gt;Read it&lt;/a&gt; and spread the word.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-4529131539222670740?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/4529131539222670740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=4529131539222670740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4529131539222670740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4529131539222670740'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2009/02/read-rocks-into-gold-and-spread-word.html' title='Read &quot;Rocks into Gold&quot; and spread the word!'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-2319459110131822979</id><published>2008-07-16T09:38:00.002+01:00</published><updated>2008-07-16T10:32:22.747+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='change'/><title type='text'>How do new ideas spread?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cocking.co.uk/blog/uploaded_images/chasm-716529.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.cocking.co.uk/blog/uploaded_images/chasm-716527.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've recently been studying how we change the way that we develop software. This links in with the broader question of how innovations spread. The best-known book on this is Geoffrey Moore's &lt;a href="http://www.amazon.co.uk/Crossing-Chasm-Marketing-Technology-Mainstream/dp/1841120634/cockiandco-21"&gt;&lt;span style="font-style: italic;"&gt;Crossing the Chasm&lt;/span&gt;&lt;/a&gt;, which explores the obstacles faced by high-tech innovation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Crossing the Chasm&lt;/span&gt; is an influential and readable book, generous in its acknowledgements and full of good stories, but it has no bibliography. For sixteen years I've been looking for the book that introduced the technology life cycle. Moore refers to it but never names it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cocking.co.uk/blog/uploaded_images/innovations-745037.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.cocking.co.uk/blog/uploaded_images/innovations-745034.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I think I've found it in &lt;a href="http://www.amazon.co.uk/Diffusion-Innovations-Everett-M-Rogers/dp/0743222091/cockiandco-21"&gt;&lt;span style="font-style: italic;"&gt;Diffusion of Innovations&lt;/span&gt;&lt;/a&gt;, by Everett M. Rogers. It's now in its fifth edition. Its examples are extensive and compelling, and it has an extensive bibliography. Best of all, it includes a checklist of the key attributes of innovations. Rogers calls them&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Relative advantage&lt;/li&gt;&lt;li&gt;Compatibility&lt;/li&gt;&lt;li&gt;Complexity&lt;/li&gt;&lt;li&gt;Trialability  and&lt;/li&gt;&lt;li&gt;Observability&lt;/li&gt;&lt;/ol&gt;These perceptions largely determine the rate at which we adopt an innovation, so anyone in the business of change needs to study them carefully.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.uk/Diffusion-Innovations-Everett-M-Rogers/dp/0743222091/cockiandco-21"&gt;&lt;span style="font-style: italic;"&gt;Diffusion of Innovations&lt;/span&gt;&lt;/a&gt; is a scholarly work, and needs more time to read than &lt;span style="font-style: italic;"&gt;Crossing the Chasm&lt;/span&gt;. For me that time has been well-spent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-2319459110131822979?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/2319459110131822979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=2319459110131822979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2319459110131822979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2319459110131822979'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/07/how-do-new-ideas-spread.html' title='How do new ideas spread?'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-2541157946695291280</id><published>2008-07-16T07:47:00.002+01:00</published><updated>2008-07-16T08:07:05.462+01:00</updated><title type='text'>SPA2009 open for session proposals</title><content type='html'>&lt;a href="http://www.spaconference.org/spa2009/"&gt;SPA2009&lt;/a&gt; is now accepting session proposals, and some have already arrived.&lt;br /&gt;&lt;br /&gt;If you would like to present at this unique conference you'll find the &lt;a href="http://www.spaconference.org/spa2009/index.php?page=lead-a-session"&gt;call for proposals&lt;/a&gt; on the SPA2009 website.&lt;br /&gt;&lt;br /&gt;If you want to attend the conference, consider proposing a session. As a session leader, you will&lt;br /&gt;&lt;ol&gt;&lt;li&gt;have fun&lt;/li&gt;&lt;li&gt;polish your communication skills&lt;br /&gt;&lt;/li&gt;&lt;li&gt;improve your profile in the industry&lt;/li&gt;&lt;li&gt;and get a substantial discount!&lt;/li&gt;&lt;/ol&gt;You'll be helped by a supportive shepherding process. SPA shepherds are experienced presenters and many of them have coming to the conference for years. The shepherds can help you develop a successful session that takes full advantage of SPA's interactive format.&lt;br /&gt;&lt;br /&gt;The deadline for submissions is 6pm on Monday 15th September 2008.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-2541157946695291280?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/2541157946695291280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=2541157946695291280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2541157946695291280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2541157946695291280'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/07/spa2009-open-for-session-proposals.html' title='SPA2009 open for session proposals'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-7005371383321611755</id><published>2008-07-12T08:11:00.004+01:00</published><updated>2008-07-12T08:39:41.052+01:00</updated><title type='text'>miniSPA2008 and cfp for Spa2009</title><content type='html'>I spent yesterday at &lt;a href="http://www.bcs-spa.org/minispa2008.html"&gt;miniSPA2008.&lt;/a&gt; MiniSPA is the free one-day taster for the annual &lt;a href="http://www.spaconference.org/spa2009/index.php"&gt;Software Practice Advancement conference&lt;/a&gt;. Lots of new faces yesterday, as well as old friends. It looks as if we'll get lots of new session leaders for next year's conference, which is great.&lt;br /&gt;&lt;br /&gt;Session leaders get a significant discount; for the next conference, one of them will pay nothing! &lt;a href="http://www.spaconference.org/spa2009/index.php?page=lead-a-session"&gt;Details on the SPA2009 "lead a session" page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you're new to leading conference sessions, a supportive shepherding process will help you to hone your skills. Quite a few big names on the conference circuit cut their teeth at SPA.&lt;br /&gt;&lt;br /&gt;Whether you're an expert in the making or a hardened veteran, make sure you get your proposal in soon. Submissions open on Monday, and the deadline for submissions is 6pm on 15th September 2008.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-7005371383321611755?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7005371383321611755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7005371383321611755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7005371383321611755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7005371383321611755'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/07/minispa2008-and-cfp-for-spa2009.html' title='miniSPA2008 and cfp for Spa2009'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-2015389543714232793</id><published>2008-04-28T09:50:00.012+01:00</published><updated>2008-04-28T10:46:18.842+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wiki'/><category scheme='http://www.blogger.com/atom/ns#' term='knowledge representation'/><category scheme='http://www.blogger.com/atom/ns#' term='Mind Map'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>TiddlyWiki to MindMap converter</title><content type='html'>Knowledge is my stock in trade, and I use &lt;a href="http://www.tiddlywiki.com/"&gt;TiddlyWiki&lt;/a&gt; and &lt;a href="http://www.buzanworld.com/"&gt;Mind Mapping&lt;/a&gt; a lot.&lt;br /&gt;&lt;br /&gt;Like all Wikis, TiddlyWiki is a great tool for capturing ideas and facts in text and linking them to other relevant topics. It's not so good at showing you the big picture.&lt;br /&gt;&lt;br /&gt;Mind Maps (tm) are a great way of presenting the big picture, but programs like &lt;a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page"&gt;FreeMind&lt;/a&gt; and &lt;a href="http://www.mindjet.com/"&gt;MindManager&lt;/a&gt; (tm) only show the notes for a single branch at a time.&lt;br /&gt;&lt;br /&gt;What if you think of each tool as giving a &lt;span style="font-style: italic;"&gt;different view on the same data&lt;/span&gt;? Then you could get the best of both worlds.&lt;br /&gt;&lt;br /&gt;There's already a &lt;a href="http://dahukanna.net/wiki/tiddlywiki.htm"&gt;hypergraph extension&lt;/a&gt; for TiddlyWiki which allows you to see a visual  representation of wiki contents but I prefer a more conventional Mind Map that I can edit.&lt;br /&gt;&lt;br /&gt;I'm currently experimenting with a simple &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; script which converts a TiddlyWiki into a FreeMind Mind Map. The converter works well for small wikis and I'm currently researching how best to structure larger maps.&lt;br /&gt;&lt;br /&gt;The converter isn't ready for prime time yet, and documentation is minimal, but it's evolving fast. If you're interested please drop me a note ( at romilly dot cocking at gmail dot com) and I'll send you a copy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-2015389543714232793?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/2015389543714232793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=2015389543714232793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2015389543714232793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2015389543714232793'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/04/tiddlywiki-to-mindmap-converter.html' title='TiddlyWiki to MindMap converter'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-7586243687847896323</id><published>2008-04-25T16:26:00.003+01:00</published><updated>2008-04-25T16:36:29.316+01:00</updated><title type='text'>History meme</title><content type='html'>Mom, &lt;a href="http://www.tbray.org/ongoing/When/200x/2008/04/15/History-Meme"&gt;Tim made me do it...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;romilly@samba:~$ history | awk&lt;br /&gt;'{a[$2]++}END{for(i in a){print a[i] " " i}}'&lt;br /&gt;| sort -rn | head&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;106 ls&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;96 sudo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;52 cd&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;22 nano&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;16 man&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;16 find&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;16 exit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;13 chmod&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;12 cat&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;10 scp&lt;/span&gt;&lt;/pre&gt;and, on the Virtual server that hosts samba,&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;romilly@pc031:~$  history | awk&lt;br /&gt;'{a[$2]++}END{for(i in a){print a[i] " " i}}'&lt;br /&gt; | sort -rn | head&lt;br /&gt;111 ls&lt;br /&gt;78 cd&lt;br /&gt;76 sudo&lt;br /&gt;32 exit&lt;br /&gt;23 top&lt;br /&gt;21 ping&lt;br /&gt;18 df&lt;br /&gt;13 du&lt;br /&gt;11 scp&lt;br /&gt;11 man&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-7586243687847896323?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7586243687847896323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7586243687847896323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7586243687847896323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7586243687847896323'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/04/history-meme.html' title='History meme'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-278831804954790729</id><published>2008-04-15T11:52:00.003+01:00</published><updated>2008-04-15T12:12:39.466+01:00</updated><title type='text'>Layers considered harmful: design to interfaces</title><content type='html'>Mark Dalgarno recently published &lt;a href="http://blog.software-acumen.com/2008/04/11/snowflakes-and-architecture-layers-considered-harmful-steve-love-at-accu-2008/"&gt;an excellent summary&lt;/a&gt; of a session presented by Steve Love at &lt;a href="http://accu.org/index.php/conferences/accu_conference_2008/accu2008_sessions"&gt;ACCU.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The talk offers a critique of the traditional doctrine that architectures should be &lt;span style="font-style: italic;"&gt;layered&lt;/span&gt;. Instead, Love proposes a style based on &lt;span style="font-style: italic;"&gt;designing to interfaces&lt;/span&gt;. That's music to my ears: it's exactly the approach we take in our new &lt;span style="font-style: italic;"&gt;TDD with jMock2&lt;/span&gt; course.&lt;br /&gt;&lt;br /&gt;Love's presentation is &lt;a href="http://accu.org/index.php/conferences/accu_conference_2008/accu2008_sessions"&gt;available as a pdf&lt;/a&gt;. The first half consists of visuals alone; the second half combines the same visuals with notes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-278831804954790729?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/278831804954790729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=278831804954790729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/278831804954790729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/278831804954790729'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/04/layers-considered-harmful-design-to.html' title='Layers considered harmful: design to interfaces'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-917951464603619311</id><published>2008-04-06T11:30:00.005+01:00</published><updated>2008-04-15T11:51:33.964+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated testing'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Testing Hibernate-based Persistent objects without Spring</title><content type='html'>&lt;a href="http://nat.truemesh.com/"&gt;Nat Pryce&lt;/a&gt; just pointed me at an excellent article on &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.time4tea.net/wiki/display/MAIN/Testing+Persistent+Objects+Without+Spring"&gt;Testing Persistent Objects Without Spring&lt;/a&gt;&lt;/span&gt; by James Richardson.&lt;br /&gt;&lt;br /&gt;It shows both the integration test and the code under test.&lt;br /&gt;&lt;br /&gt;Lots of good ideas/good practice.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-917951464603619311?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/917951464603619311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=917951464603619311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/917951464603619311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/917951464603619311'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/04/testing-hibernate-based-persistent.html' title='Testing Hibernate-based Persistent objects without Spring'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-8631564648478226678</id><published>2008-03-28T14:19:00.006Z</published><updated>2008-03-28T15:10:00.503Z</updated><title type='text'>Testing RIAs with WebDriver</title><content type='html'>If you need to test Rich Internet Applications from Java, take a look at &lt;a href="http://code.google.com/p/webdriver/"&gt;Webdriver&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Things I like about it:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It uses real browsers to run the tests, quirks and all&lt;/li&gt;&lt;li&gt;It's got a &lt;font style="font-style: italic;"&gt;literate testing&lt;/font&gt; interface based on &lt;a href="http://code.google.com/p/hamcrest/"&gt;Hamcres&lt;/a&gt;t and inspired by &lt;a href="https://lift.dev.java.net/"&gt;LiFT&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;Here's a very simple example.It's doing simple tests on a static html site:&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomePageTest&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;HamcrestWebDriverTestCase&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;br /&gt;   &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;WebDriver&lt;/span&gt; &lt;span class="nf"&gt;createDriver&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HtmlUnitDriver&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;testHomePageHasTitleAndHeading&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;br /&gt;         &lt;span class="k"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;span class="n"&gt;goTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://test.intranet&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;br /&gt;      &lt;span class="n"&gt;assertPresenceOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Agile&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;))));&lt;/span&gt;&lt;br /&gt;      &lt;span class="n"&gt;assertPresenceOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;containsString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Cocking and Co.&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;))));&lt;/span&gt;&lt;br /&gt;      &lt;span class="n"&gt;assertPresenceOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heading&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;equalTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Agile Application Development&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;))));&lt;/span&gt;&lt;br /&gt;   &lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This won't quite work out of the box, as there is no heading finder, but adding one is easy:&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;font class="k"&gt;public&lt;/font&gt; &lt;font class="k"&gt;class&lt;/font&gt; &lt;font class="nc"&gt;HeadingFinder&lt;/font&gt; &lt;font class="k"&gt;extends&lt;/font&gt; &lt;font class="n"&gt;HtmlTagFinder&lt;/font&gt; &lt;font class="o"&gt;{&lt;/font&gt;&lt;br /&gt;  &lt;font class="k"&gt;private&lt;/font&gt; &lt;font class="k"&gt;final&lt;/font&gt; &lt;font class="kt"&gt;int&lt;/font&gt; &lt;font class="n"&gt;level&lt;/font&gt;&lt;font class="o"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font class="k"&gt;public&lt;/font&gt; &lt;font class="nf"&gt;HeadingFinder&lt;/font&gt;&lt;font class="o"&gt;(&lt;/font&gt;&lt;font class="kt"&gt;int&lt;/font&gt; &lt;font class="n"&gt;level&lt;/font&gt;&lt;font class="o"&gt;)&lt;/font&gt; &lt;font class="o"&gt;{&lt;/font&gt;&lt;br /&gt;     &lt;font class="k"&gt;this&lt;/font&gt;&lt;font class="o"&gt;.&lt;/font&gt;&lt;font class="na"&gt;level&lt;/font&gt; &lt;font class="o"&gt;=&lt;/font&gt; &lt;font class="n"&gt;level&lt;/font&gt;&lt;font class="o"&gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font class="o"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font class="nd"&gt;@Override&lt;/font&gt;&lt;br /&gt;  &lt;font class="k"&gt;protected&lt;/font&gt; &lt;font class="n"&gt;String&lt;/font&gt; &lt;font class="nf"&gt;tagDescription&lt;/font&gt;&lt;font class="o"&gt;()&lt;/font&gt; &lt;font class="o"&gt;{&lt;/font&gt;&lt;br /&gt;     &lt;font class="k"&gt;return&lt;/font&gt; &lt;font class="s"&gt;"heading level "&lt;/font&gt;&lt;font class="o"&gt;+&lt;/font&gt;&lt;font class="n"&gt;level&lt;/font&gt;&lt;font class="o"&gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font class="o"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font class="nd"&gt;@Override&lt;/font&gt;&lt;br /&gt;  &lt;font class="k"&gt;protected&lt;/font&gt; &lt;font class="n"&gt;String&lt;/font&gt; &lt;font class="nf"&gt;tagName&lt;/font&gt;&lt;font class="o"&gt;()&lt;/font&gt; &lt;font class="o"&gt;{&lt;/font&gt;&lt;br /&gt;     &lt;font class="k"&gt;return&lt;/font&gt; &lt;font class="s"&gt;"h"&lt;/font&gt;&lt;font class="o"&gt;+&lt;/font&gt;&lt;font class="n"&gt;level&lt;/font&gt;&lt;font class="o"&gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font class="o"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;font class="k"&gt;public&lt;/font&gt; &lt;font class="k"&gt;static&lt;/font&gt; &lt;font class="n"&gt;HeadingFinder&lt;/font&gt; &lt;font class="nf"&gt;heading&lt;/font&gt;&lt;font class="o"&gt;(&lt;/font&gt;&lt;font class="kt"&gt;int&lt;/font&gt; &lt;font class="n"&gt;level&lt;/font&gt;&lt;font class="o"&gt;)&lt;/font&gt; &lt;font class="o"&gt;{&lt;/font&gt;&lt;br /&gt;     &lt;font class="k"&gt;return&lt;/font&gt; &lt;font class="k"&gt;new&lt;/font&gt; &lt;font class="nf"&gt;HeadingFinder&lt;/font&gt;&lt;font class="o"&gt;(&lt;/font&gt;&lt;font class="n"&gt;level&lt;/font&gt;&lt;font class="o"&gt;);&lt;/font&gt;&lt;br /&gt;  &lt;font class="o"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;font class="o"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;It's fairly new, but there are now pre-built binaries available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-8631564648478226678?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/8631564648478226678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=8631564648478226678' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8631564648478226678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8631564648478226678'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/03/testing-rias-with-webdriver.html' title='Testing RIAs with WebDriver'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-2567811978652699646</id><published>2008-03-25T10:00:00.004Z</published><updated>2008-03-26T17:55:02.835Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SPA'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='Category Theory'/><category scheme='http://www.blogger.com/atom/ns#' term='FP'/><title type='text'>Category Theory/Haskell learning group in London</title><content type='html'>Peter Marks organised a BOF (Birds of a feather) session on Category Theory at Spa2008.  To my surprise about twelve of us turned up. We discovered a shared intuition (bizarre though it seems) that  Category Theory will somehow shape the &lt;font style="font-style: italic;"&gt;next big thing&lt;/font&gt; in application development. Less surprisingly, we also discovered a common enthusiasm for Haskell.&lt;br /&gt;&lt;br /&gt;We want to build on this. Most of us are based in London, or can reach it easily. We plan to meet regularly (about once a month) to explore these ideas and to help each other to learn.&lt;br /&gt;&lt;br /&gt;I'll post more about this as soon as we have a date and location for our first meeting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-2567811978652699646?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/2567811978652699646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=2567811978652699646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2567811978652699646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2567811978652699646'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/03/category-theoryhaskell-learning-group.html' title='Category Theory/Haskell learning group in London'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-7439178569397587334</id><published>2008-03-25T09:56:00.005Z</published><updated>2008-03-26T20:35:15.849Z</updated><title type='text'>Spa2008 retrospectve</title><content type='html'>I'm back from Spa2008, and my head is buzzing.&lt;br /&gt;&lt;br /&gt;I felt this was the best Spa conference in recent years. As chairman I'm biased, but I'm not responsible for the quality. That's down to the programme chairs (Eoin Woods and Ivan Moore) and to Andy Moorley who organised things perfectly.&lt;br /&gt;&lt;br /&gt;I went to (and really enjoyed):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mirror, Mirror on the wall - why me? &lt;span style="font-style: italic;"&gt;Chris Cooper-Bland and &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Portia Tung&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Thou Shalt Integrate by the Sweat of Thy Brow... &lt;span style="font-style: italic;"&gt;Robert James and Eoin Woods&lt;/span&gt;&lt;/li&gt;&lt;li&gt;The Need for Speed &lt;span style="font-style: italic;"&gt;Paul Dyson and John Nolan&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Awesome Acceptance Testing &lt;span style="font-style: italic;"&gt;Dan North and Joe Walnes&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Spanish Guitar Recital &lt;span style="font-style: italic;"&gt;David Harvey&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Is Software Practice Advancing? &lt;span style="font-style: italic;"&gt;John Daniels and friends&lt;/span&gt;&lt;/li&gt;&lt;li&gt;A few things I learned in 50 years of programming &lt;span style="font-style: italic;"&gt;L Peter Deutsch&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Big Ball of Money, Big Ball of Mud: Economics and Legacy Code &lt;span style="font-style: italic;"&gt;Michael Feathers&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Closing the Knowing Doing Gap &lt;span style="font-style: italic;"&gt;Allan Kelly and Lise Hvatum&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Now it's time to start thinking about Spa2009!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-7439178569397587334?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7439178569397587334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7439178569397587334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7439178569397587334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7439178569397587334'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/03/spa2008-retrospectve.html' title='Spa2008 retrospectve'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-2381752177144467320</id><published>2008-02-26T11:36:00.004Z</published><updated>2008-02-28T08:40:30.899Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Fewer, better people</title><content type='html'>I've just read &lt;a href="http://martinfowler.com/bliki/CheaperTalentHypothesis.html"&gt;Martin Fowler's post about the Cheaper Talent Hypothesis&lt;/a&gt;. It's an issue that most of us have encountered.&lt;br /&gt;&lt;br /&gt;If you're in IT, feel underpaid, and think that you're above average (as &gt; 50% of us do), you'll have wondered why you aren't rewarded in keeping with your worth.&lt;br /&gt;&lt;br /&gt;I suspect the main reason that good developers are undervalued is that most people think that software is easy to write. Since many IT projects fail, the implication is that we can't very good at what we do.&lt;br /&gt;&lt;br /&gt;The conclusion is false because the premise is false. Writing good software is one of the hardest things that people do. I'd love to find some way to allow non-developers to find that out for themselves.&lt;br /&gt;&lt;br /&gt;IBM used to run introductory programming courses which included a session called &lt;span style="font-style: italic;"&gt;keep the alien alive&lt;/span&gt;. The instructor played a dumb alien who obeyed spoken instructions literally; the class had to tell him/her how to drink a glass of water. It was surprisingly hard to do, and the instructor usually got soaked. But it really brought home the fact that programming is hard.&lt;br /&gt;&lt;br /&gt;How could we update this for the 21st century?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-2381752177144467320?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/2381752177144467320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=2381752177144467320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2381752177144467320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/2381752177144467320'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2008/02/fewer-better-people.html' title='Fewer, better people'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-5997046612314521668</id><published>2007-10-16T12:23:00.000+01:00</published><updated>2007-10-16T15:44:21.854+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python jyton programming'/><title type='text'>Jython lives!</title><content type='html'>It's  good to see that Jython is under active development again.&lt;br /&gt;&lt;br /&gt;I use cPython a lot.  I'd pretty much stopped using Jython because it does not currently support language features that I find essential - decimals, generators and list comprehensions, for example.&lt;br /&gt;&lt;br /&gt;The project seemed to be dormant, but &lt;a href="http://www.jython.org/Project/roadmap.html#id2"&gt;Jython 2.2&lt;/a&gt; has just been released, and it looks like &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=46661#238687"&gt;Jython 2.5&lt;/a&gt;&lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=46661#238687"&gt; is on the way&lt;/a&gt;, with all the critical features that I need. Excellent news!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-5997046612314521668?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/5997046612314521668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=5997046612314521668' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5997046612314521668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5997046612314521668'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/10/jython-lives.html' title='Jython lives!'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-8208437083287327958</id><published>2007-09-24T18:32:00.002+01:00</published><updated>2008-03-26T17:51:32.233Z</updated><title type='text'>Download all pdfs in a web page</title><content type='html'>A while ago I found an out-of-print book with a web-page that listed a series of downloadable pdfs.&lt;br /&gt;&lt;br /&gt;Since there were 17 chapters and several other sections, I didn't want to  right-click my way through the list so  I wrote a quick Python script to do it for me.&lt;br /&gt;&lt;br /&gt;This must be a Python idiom. I've had to re-invent it so often, I thought I'd blog it so that I -and you - will never have to create it from scratch again.&lt;br /&gt;&lt;br /&gt;Here it is.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:Lucida,Courier New;"&gt;&lt;span style="color: rgb(192, 0, 0);"&gt;import&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;urllib&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;re&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;sys&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;# download each pdf linked to in a web-page.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;# assumes that the urls are all relative,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;# which is usually the case&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pdflink&lt;/span&gt; &lt;span style="color: rgb(0, 0, 192);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;re&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;compile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 64, 128);"&gt;r'&amp;lt;a href="(.*\.pdf)"&amp;gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;baseURL&lt;/span&gt; &lt;span style="color: rgb(0, 0, 192);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;sys&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;argv&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 128, 192);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;page&lt;/span&gt; &lt;span style="color: rgb(0, 0, 192);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;urllib&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;urlopen&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;baseURL&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 64, 128);"&gt;"contents.html"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(192, 0, 0);"&gt;for&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;line&lt;/span&gt; &lt;span style="color: rgb(192, 0, 0);"&gt;in&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;page&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;readlines&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 0, 0);"&gt;match&lt;/span&gt; &lt;span style="color: rgb(0, 0, 192);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;pdflink&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;search&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;line&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(192, 0, 0);"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;match&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;:&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 0);"&gt;filename&lt;/span&gt; &lt;span style="color: rgb(0, 0, 192);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;match&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;group&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 128, 192);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(192, 0, 0);"&gt;print&lt;/span&gt; &lt;span style="color: rgb(0, 64, 128);"&gt;"downloading %s"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 192);"&gt;%&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;filename&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: rgb(0, 0, 0);"&gt;urllib&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;urlretrieve&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;baseURL&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filename&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;filename&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-8208437083287327958?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/8208437083287327958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=8208437083287327958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8208437083287327958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8208437083287327958'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/09/download-all-pdfs-in-web-page.html' title='Download all pdfs in a web page'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-7693640606010765853</id><published>2007-09-24T15:00:00.000+01:00</published><updated>2007-09-24T15:21:09.639+01:00</updated><title type='text'>Google soft-launches social bookmarking tool</title><content type='html'>&lt;span style="text-decoration: underline;"&gt;Is &lt;/span&gt;&lt;a href="http://www.google.com/s2/sharing/resources/static/html/help.html"&gt;Google shared stuff&lt;/a&gt; the latest hot thing? It's a new social bookmarking tool.&lt;br /&gt;&lt;br /&gt;It's available now, although you won't yet find it in the list of &lt;a href="http://www.google.co.uk/intl/en/options/index.html"&gt;Google services and tools&lt;/a&gt;, nor on the Google labs page.&lt;br /&gt;&lt;br /&gt;As well as sharing with your friends, the new bookmarklet allows you to share your links via several third-party sites, including &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;, &lt;a href="http://digg.com/"&gt;digg&lt;/a&gt;, &lt;a href="http://reddit.com/"&gt;reddit&lt;/a&gt; and &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In itself, it wouldn't be worldshaking; but&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It's from Google&lt;/li&gt;&lt;li&gt;There are rumors of a soon-to-be-released Google api for social networking.&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/9053945-7693640606010765853?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7693640606010765853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7693640606010765853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7693640606010765853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7693640606010765853'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/09/google-soft-launches-social-bookmarking.html' title='Google soft-launches social bookmarking tool'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-8176290194563641289</id><published>2007-09-22T07:36:00.000+01:00</published><updated>2007-09-22T08:16:44.603+01:00</updated><title type='text'>Count Blog subscriptions with this Python script</title><content type='html'>If you blog, you're probably keen to know the size of your readership. Many of your subscribers will use an RSS aggregation service, and these days there are lots of feed aggregators. How do you &lt;span style="font-weight: bold;"&gt;count the subscribers&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;This short &lt;span style="font-weight: bold;"&gt;Python script&lt;/span&gt; does just that.&lt;br /&gt;&lt;br /&gt;If you can access the httpd logs of the server that hosts your blog, you'll find that many aggregators send you a subscriber count when they check for new blog entries.&lt;br /&gt;&lt;br /&gt;A log entry for a typical aggregator request looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;65.214.44.29 - - [21/Sep/2007:04:12:34 +0100]&lt;br /&gt;   "GET /atom.xml HTTP/1.1" 200 0 "-"&lt;br /&gt;   "Bloglines/3.1 (http://www.bloglines.com; 10 subscribers)"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The Python script below filters out lines that contain the string "subscribers", extracts the Ip address and subscriber count, and calculates the total number of subscriptions.&lt;br /&gt;&lt;br /&gt;The script is very simple, but there are a couple of wrinkles.&lt;br /&gt;&lt;br /&gt;A singe log file can include multiple requests from a given aggregator. The script puts counts into a dictionary keyed by the aggregator's ip address, so the total count includes the latest value for each aggregator.&lt;br /&gt;&lt;br /&gt;In theory, you could get a request that included the string 'subscriber' from some other source. (For example, someone might visit a URL for newsletter subscribers.)&lt;br /&gt;The script has a fudge to treat such requests as if they came from a dummy aggregator with no subscribers.&lt;br /&gt;&lt;br /&gt;Here's the script:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;font face="Lucida,Courier New"&gt;&lt;font color="#008000"&gt;# count blog subscribers from httpd log file &lt;br /&gt;&lt;/font&gt;&lt;font color="#C00000"&gt;import&lt;/font&gt; &lt;font color="#000000"&gt;re&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#000000"&gt;ip&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt;&lt;font color="#004080"&gt;r"^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;anything&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#004080"&gt;".*"&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;count&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#004080"&gt;r"\s(\d+)\s"&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;subscriber&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#004080"&gt;"subscriber"&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;subscription_entry&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;re&lt;/font&gt;&lt;font color="#0000C0"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;compile&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ip&lt;/font&gt;&lt;font color="#0000C0"&gt;+&lt;/font&gt;&lt;font color="#000000"&gt;anything&lt;/font&gt;&lt;font color="#0000C0"&gt;+&lt;/font&gt;&lt;font color="#000000"&gt;count&lt;/font&gt;&lt;font color="#0000C0"&gt;+&lt;/font&gt;&lt;font color="#000000"&gt;subscriber&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#C00000"&gt;def&lt;/font&gt; &lt;font color="#000000"&gt;ipc&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;line&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;font color="#0000C0"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;match&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;subscription_entry&lt;/font&gt;&lt;font color="#0000C0"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;search&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;line&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="#C00000"&gt;if&lt;/font&gt; &lt;font color="#000000"&gt;match&lt;/font&gt;&lt;font color="#0000C0"&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color="#C00000"&gt;return&lt;/font&gt; &lt;font color="#000000"&gt;match&lt;/font&gt;&lt;font color="#0000C0"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;group&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#0080C0"&gt;1&lt;/font&gt;&lt;font color="#0000C0"&gt;,&lt;/font&gt;&lt;font color="#0080C0"&gt;2&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="#C00000"&gt;else&lt;/font&gt;&lt;font color="#0000C0"&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color="#008000"&gt;# just in case the line contains 'subscriber'&lt;br /&gt;&lt;/font&gt;        &lt;font color="#008000"&gt;# but does not match the regular expression&lt;br /&gt;&lt;/font&gt;        &lt;font color="#000000"&gt;null_entry&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#004080"&gt;"0.0.0.0"&lt;/font&gt;&lt;font color="#0000C0"&gt;,&lt;/font&gt; &lt;font color="#0080C0"&gt;0&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color="#C00000"&gt;return&lt;/font&gt; &lt;font color="#000000"&gt;null_entry&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#C00000"&gt;def&lt;/font&gt; &lt;font color="#000000"&gt;total_counts&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ips_and_counts&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;font color="#0000C0"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#008000"&gt;# there may be multiple log entries for a given aggregator&lt;br /&gt;&lt;/font&gt;    &lt;font color="#008000"&gt;# so we use a dictionary and just keep the last value &lt;br /&gt;&lt;/font&gt;    &lt;font color="#008000"&gt;#  which is the latest one for each aggregator&lt;br /&gt;&lt;/font&gt;    &lt;font color="#000000"&gt;dict&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#0000C0"&gt;{&lt;/font&gt;&lt;font color="#0000C0"&gt;}&lt;/font&gt;&lt;br /&gt;    &lt;font color="#C00000"&gt;for&lt;/font&gt; &lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;ip&lt;/font&gt;&lt;font color="#0000C0"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;count&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt; &lt;font color="#C00000"&gt;in&lt;/font&gt; &lt;font color="#000000"&gt;ips_and_counts&lt;/font&gt;&lt;font color="#0000C0"&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color="#000000"&gt;dict&lt;/font&gt;&lt;font color="#0000C0"&gt;[&lt;/font&gt;&lt;font color="#000000"&gt;ip&lt;/font&gt;&lt;font color="#0000C0"&gt;]&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;int&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;count&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="#C00000"&gt;return&lt;/font&gt; &lt;font color="#000000"&gt;sum&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;dict&lt;/font&gt;&lt;font color="#0000C0"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;values&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#C00000"&gt;def&lt;/font&gt; &lt;font color="#000000"&gt;countSubscribersInLogFile&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;filename&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;font color="#0000C0"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;file&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;open&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;filename&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;counts&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#0000C0"&gt;[&lt;/font&gt;&lt;font color="#000000"&gt;ipc&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;line&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt; &lt;font color="#C00000"&gt;for&lt;/font&gt; &lt;font color="#000000"&gt;line&lt;/font&gt; &lt;font color="#C00000"&gt;in&lt;/font&gt; &lt;font color="#000000"&gt;file&lt;/font&gt; &lt;font color="#C00000"&gt;if&lt;/font&gt; &lt;font color="#000000"&gt;subscriber&lt;/font&gt; &lt;font color="#C00000"&gt;in&lt;/font&gt; &lt;font color="#000000"&gt;line&lt;/font&gt;&lt;font color="#0000C0"&gt;]&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;total&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;total_counts&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;counts&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;file&lt;/font&gt;&lt;font color="#0000C0"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;close&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="#C00000"&gt;return&lt;/font&gt; &lt;font color="#000000"&gt;total&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#C00000"&gt;if&lt;/font&gt; &lt;font color="#000000"&gt;__name__&lt;/font&gt; &lt;font color="#0000C0"&gt;==&lt;/font&gt; &lt;font color="#004080"&gt;"__main__"&lt;/font&gt;&lt;font color="#0000C0"&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color="#C00000"&gt;import&lt;/font&gt; &lt;font color="#000000"&gt;os&lt;/font&gt;&lt;font color="#0000C0"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;sys&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;filename&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#000000"&gt;sys&lt;/font&gt;&lt;font color="#0000C0"&gt;.&lt;/font&gt;&lt;font color="#000000"&gt;argv&lt;/font&gt;&lt;font color="#0000C0"&gt;[&lt;/font&gt;&lt;font color="#0080C0"&gt;1&lt;/font&gt;&lt;font color="#0000C0"&gt;]&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000"&gt;details&lt;/font&gt; &lt;font color="#0000C0"&gt;=&lt;/font&gt; &lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;countSubscribersInLogFile&lt;/font&gt;&lt;font color="#0000C0"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;filename&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;font color="#0000C0"&gt;,&lt;/font&gt; &lt;font color="#000000"&gt;filename&lt;/font&gt;&lt;font color="#0000C0"&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color="#C00000"&gt;print&lt;/font&gt; &lt;font color="#004080"&gt;"%d subscriptions in %s"&lt;/font&gt; &lt;font color="#0000C0"&gt;%&lt;/font&gt; &lt;font color="#000000"&gt;details&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-8176290194563641289?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/8176290194563641289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=8176290194563641289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8176290194563641289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8176290194563641289'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/09/count-blog-subscriptions-with-this.html' title='Count Blog subscriptions with this Python script'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-4266346636515013197</id><published>2007-09-10T11:21:00.000+01:00</published><updated>2007-09-10T11:28:09.477+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bulder'/><category scheme='http://www.blogger.com/atom/ns#' term='test data'/><category scheme='http://www.blogger.com/atom/ns#' term='unti test'/><title type='text'>Builders</title><content type='html'>Nat Price has posted an excellent overview of &lt;a href="http://nat.truemesh.com/archives/000714.html"&gt;Test Data Builders&lt;/a&gt;. (Don't be put off by the image!)&lt;br /&gt;&lt;br /&gt;Sadly, he doesn't (yet) say much about the problem of &lt;a href="http://www.cocking.co.uk/blog/2007/07/unit-testing-builders.html"&gt;unit testing builders&lt;/a&gt;, though he does point out that Builder classes may well find their way into production code.&lt;span style="font-style: italic;"&gt; Nat, that's a hint...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-4266346636515013197?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/4266346636515013197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=4266346636515013197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4266346636515013197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/4266346636515013197'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/09/builders.html' title='Builders'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-5721703235312944719</id><published>2007-09-10T09:39:00.001+01:00</published><updated>2007-09-10T10:23:20.396+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XPday'/><category scheme='http://www.blogger.com/atom/ns#' term='SPA'/><title type='text'>XPDay7 is shaping up; now on to SPA2008!</title><content type='html'>The programme committee for &lt;a href="http://www.xpday.org/"&gt;XPDay7&lt;/a&gt; met last week to review session proposals. We'd received an outstanding collection of submissions, so there was no problem in filling the program with quality sessions. The hard part, as usual, was to decide which ones we would &lt;span style="font-style: italic;"&gt;not &lt;/span&gt;include.&lt;br /&gt;&lt;br /&gt;The meeting went very smoothly. &lt;a href="http://www.mcs.vuw.ac.nz/%7Eangela/"&gt;Angela Martin&lt;/a&gt; and &lt;a href="http://ivan.truemesh.com/"&gt;Ivan Moore&lt;/a&gt; are joint program chairs this year. They put a lot of hard work into preparation, and it really paid off.&lt;br /&gt;&lt;br /&gt;If you've submitted a proposal for XPDay7, expect to hear from Angela or Ivan soon.&lt;br /&gt;&lt;br /&gt;I'm now bending my mind to &lt;a href="http://www.spaconference.org/spa2008/index.php"&gt;SPA2008&lt;/a&gt;. Ivan Moore and &lt;a href="http://www.eoinwoods.info/"&gt;Eoin Woods&lt;/a&gt; are joint program chairs. As conference chair, I'm as keen as they are to see another outstanding programme.&lt;br /&gt;&lt;br /&gt;If you submitted a proposal for XPDay7, consider &lt;a href="http://www.spaconference.org/spa2008/index.php?page=lead-a-session"&gt;submitting a session for SPA&lt;/a&gt;. We like a mix of new and proven sessions, so acceptance for XPay7 shouldn't stop you from submitting a similar proposal for SPA. Not should rejection - there were excellent submissions for which we just had no room, and they might well fit in the (longer) SPA programme.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;SPA deadline&lt;/span&gt; is Monday 17th September, but you don't need to submit finished material - just a proposal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-5721703235312944719?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/5721703235312944719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=5721703235312944719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5721703235312944719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5721703235312944719'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/09/xpday7-is-shaping-up-now-on-to-spa2008.html' title='XPDay7 is shaping up; now on to SPA2008!'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-8660657201638848699</id><published>2007-09-09T15:16:00.000+01:00</published><updated>2007-09-09T15:55:17.179+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AmazonS3'/><title type='text'>Backing up vital data with Amazon S3</title><content type='html'>I finally got around to trying &lt;a href="http://www.amazon.com/S3-AWS-home-page-Money"&gt;Amazon S3&lt;/a&gt; for data backup.&lt;br /&gt;&lt;br /&gt;Just in case you've missed out on S3, it's a commercial network-based data storage service offered by Amazon. They claim to use the same technology for S3 that lies behind the Amazon stores.&lt;br /&gt;&lt;br /&gt;S3 comes with no service level guarantees and there have been some reports of occasional unavailability and/or slow transfer. I'm not too worried; the things that are critical to me are data security and cost.&lt;br /&gt;&lt;br /&gt;I'm using the J&lt;a href="http://jets3t.s3.amazonaws.com/index.html"&gt;etS3t&lt;/a&gt; java(tm) tool kit to manage the interaction with the S3 service. The &lt;span style="font-style: italic;"&gt;cockpit&lt;/span&gt; application gives a GUI view of what's in your S3 buckets; the &lt;span style="font-style: italic;"&gt;synchronize &lt;/span&gt;application gives a simple command line interface that allows you to keep data on S3 in step with data on your machine(s), and retrieve that data when necessary.&lt;br /&gt;&lt;br /&gt;You need to be a little careful, as synchronization can delete data as well as add or update it. To mitigate this,  there is a  &lt;span style="font-family: courier new;"&gt;--noaction&lt;/span&gt;  option which allows you to see what &lt;span style="font-style: italic;"&gt;would &lt;/span&gt;happen to your data without actually changing anything.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Minor snags&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've hit a couple of minor snags so far; neither are caused by the S3 service itself, but you need to be aware of them.&lt;br /&gt;&lt;br /&gt;The first arose when I tried to back up a large amount of data. I'm keen to keep a copy of my cvs repository off-site; it's well backed-up, but all the recent backups are in my home office. If we had a fire or a burglary I'd be in real trouble.&lt;br /&gt;&lt;br /&gt;I realised soon after the upload started that it would take a while. The repository is about 2.7Gb and although I have fast broadband, my &lt;span style="font-style: italic;"&gt;upstream &lt;/span&gt;speed is only 256 kb/s. The upload took &lt;span style="font-style: italic;"&gt;25 hours&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Smart synchronization&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Synchronize is smart enough not to upload files if they are unchanged. I figured that the next upload would take a few minutes at most. The second snag arose when I tried to check that.&lt;br /&gt;&lt;br /&gt;Part way through the synchronize application bombed with an &lt;span style="font-family: courier new;"&gt;out of memory&lt;/span&gt; error. I've now modified the script to give it 512M of heap space, and it runs just fine. And now a burglary would be inconvenient but not disastrous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-8660657201638848699?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/8660657201638848699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=8660657201638848699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8660657201638848699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8660657201638848699'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/09/backing-up-vital-data-with-amazon-s3.html' title='Backing up vital data with Amazon S3'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-6884435103346748319</id><published>2007-09-07T13:20:00.000+01:00</published><updated>2007-09-09T15:14:52.832+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture organisation mindtools'/><title type='text'>Measuring cultural differences</title><content type='html'>&lt;span id="_user_rdqnewsletter@mindtoolsservices.com" style="color: rgb(51, 0, 51);"&gt;James Manktelow has just published an interesting article about &lt;a href="http://www.mindtools.com/pages/article/newLDR_66.htm"&gt;measuring and understanding cul&lt;/a&gt;&lt;/span&gt;&lt;a href="http://www.mindtools.com/pages/article/newLDR_66.htm"&gt;tural differences&lt;/a&gt;. It's based on &lt;a href="http://www.geert-hofstede.com/"&gt;Geert Hofstede&lt;/a&gt;'s work on &lt;span style="font-style: italic;"&gt;cultural dimensions&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Hofstede has identified five key dimensions which can be used to classify and understand local cultures. His analysis is based on a  data base collected by IBM in the 60's and 70's surveying the values of employees in more than 70 countries.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hofstede's C&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ultural Dimensions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hofstede analyses culture in these dimensions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Power Distance&lt;/li&gt;&lt;li&gt;Individualism&lt;/li&gt;&lt;li&gt;Masculinity&lt;/li&gt;&lt;li&gt;Uncertainty Avoidance and&lt;/li&gt;&lt;li&gt;Long-Term Orientation&lt;/li&gt;&lt;/ul&gt;It looks as if these measures would form a useful framework for analysing and understanding the culture of the organisations we work for.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-6884435103346748319?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/6884435103346748319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=6884435103346748319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6884435103346748319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6884435103346748319'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/09/measuring-cultural-differences.html' title='Measuring cultural differences'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-7269753912815718568</id><published>2007-09-07T10:57:00.000+01:00</published><updated>2007-09-07T11:09:19.646+01:00</updated><title type='text'>Introducing Agile - Gerry Weinberg's approach</title><content type='html'>&lt;a href="http://www.davidpeterson.co.uk/"&gt;David Petersen&lt;/a&gt; just sent me a link to a great interview:&lt;span id="MainPortalLoader__ctl38_lblTitle" class="ContentTitle"&gt; &lt;a href="http://www.pmboulevard.com/Default.aspx?page=View%20Content&amp;cid=2369&amp;amp;parent=5970"&gt;"5Qs on Agile&lt;/a&gt; with &lt;a href="http://secretsofconsulting.blogspot.com/2007/09/introducing-new-technology-agile.html"&gt;Gerald M. Weinberg"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The interview includes a neat way of getting people to want to adopt Agile techniques, rather than trying to force them.&lt;br /&gt;&lt;br /&gt;Weinbeg is one of my favourite authors, but I wasn't subscribed to his blogs. I am now.&lt;br /&gt;&lt;br /&gt;His writing blog has another interesting &lt;a href="http://weinbergonwriting.blogspot.com/2007/08/avoiding-whole-agenteditor-shenanigans.html"&gt;post about self-publishing&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-7269753912815718568?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7269753912815718568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7269753912815718568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7269753912815718568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7269753912815718568'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/09/introducing-agile-gerry-weinbergs.html' title='Introducing Agile - Gerry Weinberg&apos;s approach'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-1382501690969070268</id><published>2007-08-31T14:21:00.000+01:00</published><updated>2007-08-31T14:31:42.299+01:00</updated><title type='text'>Virtual Appliances: only run them if you trust them!</title><content type='html'>I forgot to add an important warning to yesterday's post about &lt;a href="http://www.cocking.co.uk/blog/2007/08/virtual-appliance-simple-way-to-install.html"&gt;Virtual Applicances&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;When you  start up a  virtual appliance it will probably try to get an IP address on your private network via DHCP. If the Virtual Appliance contains malicious code, it could then do all kinds of nasty things.&lt;br /&gt;&lt;br /&gt;The bottom line: as with &lt;span style="font-style: italic;"&gt;any&lt;/span&gt; software that you install behind your firewall,  &lt;span style="font-weight: bold;"&gt;don't run a virtual appliance unless you trust the source you got it from.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-1382501690969070268?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/1382501690969070268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=1382501690969070268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/1382501690969070268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/1382501690969070268'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/08/virtual-appliances-only-run-them-if-you.html' title='Virtual Appliances: only run them if you trust them!'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-8693516966520206445</id><published>2007-08-30T16:17:00.000+01:00</published><updated>2007-08-30T22:18:04.591+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VMware CMS drupal appliance'/><title type='text'>The Virtual Appliance: a simple way to install complex software</title><content type='html'>This morning I saw an email asking for suggestions for a cheap or low-cost web &lt;a href="http://www.refreshedmedia.com/glossary/content-management-system.html"&gt;content management system&lt;/a&gt;. There was one other important requirement - the software would be installed, managed and used by "semi-technical people".&lt;br /&gt;&lt;br /&gt;A couple of people suggested &lt;a href="http://drupal.org/"&gt;&lt;span style="font-weight: bold;"&gt;drupal&lt;/span&gt;.&lt;/a&gt; I've heard good things about &lt;span style="font-weight: bold;"&gt;drupal&lt;/span&gt;, so  I took a quick look at the website. Here's a sample of what hits  you on the installation page:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Drupal requires a web server, PHP4 (4.3.3 or greater) or PHP5 (&lt;a href="http://www.php.net/" title="http://www.php.net/" rel="nofollow"&gt;http://www.php.net/&lt;/a&gt;) and either MySQL (&lt;a href="http://www.mysql.com/" title="http://www.mysql.com/" rel="nofollow"&gt;http://www.mysql.com/&lt;/a&gt;) or PostgreSQL (&lt;a href="http://www.postgresql.org/" title="http://www.postgresql.org/" rel="nofollow"&gt;http://www.postgresql.org/&lt;/a&gt;).&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;That's hardly ideal for &lt;span&gt;semi-technical people&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Once &lt;span style="font-weight: bold;"&gt;drupal&lt;/span&gt; is installed, however, it seems easy to configure and use. What my friend's users need is a &lt;span style="font-style: italic;"&gt;simple way to install the application in the first place&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The best approach I can think of is to install a &lt;a href="http://www.vmware.com/appliances/"&gt;&lt;span style="font-style: italic;"&gt;Virtual Applianc&lt;/span&gt;e&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A Virtual Appliance is a virtual machine image which you can run using VMware, Xen or Parallels. It contains a complete application, pre-configured and ready to run.&lt;br /&gt;&lt;br /&gt;Using a Virtual Appliance with the free VMware player takes just 5 steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.vmware.com/download/player/"&gt;Download VMware Player&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Install it. (on Windows, that's a one-click operation).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Download and unzip a suitable Virtual Appliance.&lt;/li&gt;&lt;li&gt;Start the Player and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Start the Appliance.&lt;/li&gt;&lt;/ol&gt;Now your chosen application is up and ready for use.&lt;br /&gt;&lt;br /&gt;I tried out the &lt;a href="http://www.jumpbox.com/jumpbox-for-the-drupal-content-management-system"&gt;drupal appliance from JumpBox&lt;/a&gt;. It took me about 5 minutes to install  and start using it. (I had a bit of a head-start because I already had VMware player installed).&lt;br /&gt;&lt;br /&gt;If you know someone who wants user-friendly software but who lacks the technical expertise to install it, look and see if you can find a virtual appliance to suit.&lt;br /&gt;&lt;br /&gt;More and more software (open source and commercial) is being offered this way, and it's also a great way to distribute software that&lt;span style="font-style: italic;"&gt; you've&lt;/span&gt; written or configured.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-8693516966520206445?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/8693516966520206445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=8693516966520206445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8693516966520206445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8693516966520206445'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/08/virtual-appliance-simple-way-to-install.html' title='The Virtual Appliance: a simple way to install complex software'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-8647923657503341719</id><published>2007-08-27T17:52:00.000+01:00</published><updated>2007-09-10T07:04:46.184+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='automated testing'/><category scheme='http://www.blogger.com/atom/ns#' term='VMware'/><title type='text'>Automated end-to-end testing made easier with VMWare Server</title><content type='html'>Automated testing is one of the most important practices in Agile Development. I like to have a hierarchy of automated tests that cover the whole system as deployed and all of its component parts, right down to unit tests that tell me whether each class is fulfilling its contract.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Starting with end-to-end tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There's a lot published about unit testing and acceptance tests, but much less about end-to-end testing. That's disappointing, given that &lt;a href="http://www.mockobjects.com/2007/07/start-with-working-system.html"&gt;end-to-end tests are arguably the first thing you should work on when developing a new application&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The need for a clean deployment environment&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;End-to-end testing gives you a chance to check out your deployment process and verify that the deployed application works in the target environment. Sometimes, though, a badly planned testing process can lull you into a false sense of security; most of us have encountered applications that work well in their test environment but fail when deployed to a clean machine.&lt;br /&gt;&lt;br /&gt;It usually takes too much time and effort to create a fresh testing environment from scratch every time you want to do an end-to-end test. There is a simple fast alternative using VMWare Server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;VMware server to the rescue&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vmware.com/products/server/"&gt;VMware server&lt;/a&gt; is a free (as in beer) version of VMware's virtualisation software. I run it on an Ubuntu server, and use it to create a clean environment for applications that I'm developing. It has a snapshot capability that allows me to capture a clean "before deployment" image, and restore that in a few seconds prior to running a test. Best of all, there's an external scripting interface which allows you to automate the process.&lt;br /&gt;&lt;br /&gt;You can download VMware Server for free (after registration). I also use their commercial &lt;a href="http://www.vmware.com/products/ws/"&gt;VMware workstation&lt;/a&gt; product; the two play well together, as you'd expect, but you can do everything you need for end-to-end testing with the free product.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-8647923657503341719?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/8647923657503341719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=8647923657503341719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8647923657503341719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8647923657503341719'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/08/automated-end-to-end-testing-made.html' title='Automated end-to-end testing made easier with VMWare Server'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-3677312583090337465</id><published>2007-07-19T07:15:00.001+01:00</published><updated>2007-07-19T07:46:02.006+01:00</updated><title type='text'>JavaScript - are you serious?</title><content type='html'>One of the sessions at Monday's &lt;a href="http://bcs-spa.org/minispa2007.html"&gt;miniSPA&lt;/a&gt; conference was &lt;a href="http://bcs-spa.org/minispa2007sessions.html#javascript"&gt;Serious JavaScript&lt;/a&gt;  led by  &lt;a href="http://www.google.com/search?q=Peter+Marks&amp;sourceid=navclient-ff&amp;amp;ie=UTF-8&amp;rlz=1B2GGGL_enGB203GB203"&gt;Peter Marks&lt;/a&gt; and &lt;a href="http://www.spaconference.org/cgi-bin/wiki.pl?browse=DavidHarvey"&gt;David Harvey&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I missed the original session at SPA2007, and I was very glad to get a chance to see it second time round. I found it fascinating and alarming.&lt;br /&gt;&lt;br /&gt;It was fascinating because the presenters brought out some of JavaScript's real strengths as a development language. One example: JavaScript supports functions as first class objects, which allows smart developers to do all kinds of clever and useful things.&lt;br /&gt;&lt;br /&gt;The session was alarming because it showed how seriously JavaScript is marred by arbitrary and counter-intuitive semantics.&lt;br /&gt;&lt;br /&gt;Time after time the session leaders asked the audience to predict the results of simple JavaScript expressions. Time after time we predicted incorrectly (and sometimes the presenters did too).&lt;br /&gt;&lt;br /&gt;The language seems to have been designed around the &lt;span style="font-style: italic;"&gt;principle of &lt;span style="font-weight: bold;"&gt;most&lt;/span&gt; surprise&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;People are suggesting that JavaScript is going to be the next big language, and it looks like a fair few people at Google are in that camp, including &lt;a href="http://steve-yegge.blogspot.com/"&gt;Steve Yegge&lt;/a&gt;. If so, heaven help us all. Power and unpredictability  make a very dangerous combination.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-3677312583090337465?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/3677312583090337465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=3677312583090337465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/3677312583090337465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/3677312583090337465'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/07/javascript-are-you-serious.html' title='JavaScript - are you serious?'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-1657040440509030111</id><published>2007-07-18T20:40:00.000+01:00</published><updated>2007-08-14T07:51:31.654+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SPA jMock'/><title type='text'>miniSPA and jMock2</title><content type='html'>I spent yesterday at &lt;a href="http://bcs-spa.org/minispa2007.html"&gt;miniSPA&lt;/a&gt;. It's a selection of popular presentations from last year's SPA conference; we run it to attract new participants and new session leaders.&lt;br /&gt;&lt;br /&gt;This year's miniSPA was brilliantly organised by &lt;a href="http://ivan.truemesh.com/"&gt;Ivan Moore&lt;/a&gt; and &lt;a href="http://www.spaconference.org/cgi-bin/wiki.pl?AndyMoorley"&gt;Andy Moorley&lt;/a&gt;. Ivan is programme chair for SPA2008. Andy runs the conference, organises miniSPA, and generally keeps the whole world turning as it should.&lt;br /&gt;&lt;br /&gt;I was at miniSPA in two capacities; as next year's conference chair, and as a presenter from last year. &lt;a href="http://nat.truemesh.com/"&gt;Nat Pryce&lt;/a&gt; and I ran a tutorial on&lt;a href="http://bcs-spa.org/minispa2007sessions.html#jmock"&gt; Test Driven Development with jMock2,&lt;/a&gt; which went really well. We've offered to run it again in November at &lt;a href="http://www.xpday.org/"&gt;XPDay7&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm about to analyse the feedback and first impressions are very positive. SPA is a remarkable conference. If you haven't been, &lt;a href="http://www.spaconference.org/spa2008/index.php"&gt;take a look at the website&lt;/a&gt; and think about going next year. If you want to go next year, &lt;a href="http://www.spaconference.org/spa2008/index.php?page=lead-a-session"&gt;think about submitting a session proposal&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-1657040440509030111?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/1657040440509030111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=1657040440509030111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/1657040440509030111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/1657040440509030111'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/07/minispa-anhttpwwwbloggercompost.html' title='miniSPA and jMock2'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-8998658531825191021</id><published>2007-07-11T07:05:00.000+01:00</published><updated>2007-07-11T07:28:54.987+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Unit testing builders</title><content type='html'>Should one unit-test test Builder classes? If so, how?&lt;br /&gt;&lt;br /&gt;A well-designed application is a composed network of simple components. Many developers use one or more &lt;a href="http://c2.com/cgi/wiki?BuilderPattern"&gt;builder classes&lt;/a&gt; to construct applications.&lt;br /&gt;&lt;br /&gt;Builders can get quite complex.&lt;br /&gt;&lt;br /&gt;In many cases we want a single component to be shared by several client components. It's easy to get this wrong. If we do so, we may build a network on which all dependencies appear to be satisfied, but we have actually created multiple copies of components when a single instance should be shared.&lt;br /&gt;&lt;br /&gt;Builders often use lazy initialization, in which case they have state. This introduces additional opportunities for error.&lt;br /&gt;&lt;br /&gt;Since it's easy to get builders wrong, we need to test them. End-to-end tests will usually tell us if  we've build out application without all the necessary parts, but they don't pinpoint the problem, and they may not tell us if we've mistakenly introduced multiple objects instead of sharing a single one.&lt;br /&gt;&lt;br /&gt;This suggests that we need to write unit tests for builders, but that's often difficult. The classes that are built will hide their implementation (as they should) so unit tests cannot easily verify that the right internal components are there inside them.&lt;br /&gt;&lt;br /&gt;I'm coming to the conclusion that builder tests need to break encapsulation. That's normally a major code smell,  but the nature of builders seems to leave no alternative.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-8998658531825191021?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/8998658531825191021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=8998658531825191021' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8998658531825191021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/8998658531825191021'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2007/07/unit-testing-builders.html' title='Unit testing builders'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-5808198588120721379</id><published>2006-12-02T09:22:00.000Z</published><updated>2007-08-31T15:14:55.235+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='measurement management XPDay'/><title type='text'>Is measurement evil?</title><content type='html'>&lt;span class="post-footers"&gt;A while back Dave Snowden of the &lt;a href="http://www.cognitive-edge.com/"&gt;Cognitive Edge&lt;/a&gt; (formerly Cynefin) &lt;a href="http://www.cognitive-edge.com/2006/08/the_consequences_of_measuremen.php"&gt;posted a well-aimed comment&lt;/a&gt; about the UK Government's folly in trying to fix their outcome-based measures.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span class="post-footers"&gt;I first met Dave Snowden when he presented a keynote at &lt;a href="http://xpday5.xpday.org/"&gt;XPDay5&lt;/a&gt;. I was bowled over by his talk, as were many of the audience.&lt;br /&gt;&lt;br /&gt;Not so &lt;a href="http://www.gilb.com/"&gt;Tom Gilb&lt;/a&gt;, who was sitting next to me in the talk. Perhaps I shouldn't have been surprised: most of Tom's professional life has been focused  on helping organisations to improve thorough quantification and measurement.&lt;br /&gt;&lt;br /&gt;Both Dave and Tom are brilliant thinkers and I have been pondering ever since how two such clever people could hold such diametrically opposed views.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="post-footers"&gt;&lt;br /&gt;I had a delightful talk about this with &lt;a href="http://www.clarkeching.com/"&gt;Clarke Ching&lt;/a&gt; at &lt;a href="http://xpday6.xpday.org/"&gt;XPDay6&lt;/a&gt;. which helped to clarify my ideas.&lt;/span&gt; I've tried to summarize my understanding below.&lt;span class="post-footers"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="post-footers"&gt;If I am trying to manage others, it's useless for me &lt;span style="font-style: italic;"&gt;merely to set them measures&lt;/span&gt;. My team will game&lt;span style="font-style: italic;"&gt; &lt;/span&gt;them. I'll get what I measure. It will not be what I want. (I think that's at the core of Dave Snowden's position. It's a sufficiently common view that &lt;a href="http://amarinda.com/"&gt;Duncan Pierce &lt;/a&gt;and Jason Gorman ran a &lt;a href="http://xpday5.xpday.org/sessions.php#DoYouGetWhatYouMeasure"&gt;session&lt;/a&gt; about it and XPDay5.)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="post-footers"&gt;If I am a customer trying to define my requirements, it is sensible to &lt;span style="font-style: italic;"&gt;quantify the qualities that I require&lt;/span&gt; of  my supplier's product or service. (I think that's at the core of Tom Gilb's position).&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span class="post-footers"&gt;In order for 2. to work, I must be able to:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="post-footers"&gt;quantify the &lt;/span&gt;&lt;span class="post-footers"&gt;qualities that I require&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="post-footers"&gt;agree scales of measure for those qualities&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="post-footers"&gt;agree realistic and achievable targets based on those scales of measure&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="post-footers"&gt;monitor progress towards those targets (weekly if possible)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="post-footers"&gt;and negotiate changes to both the measures and the targets as appropriate.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="post-footers"&gt;This process relies on certain norms of behaviour by both parties. If either party seeks to cheat the other the process will break down. I think that this  leads to the final precondition for Gilb's approach to work:&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="post-footers"&gt;&lt;span&gt;Either party must be able to terminate the relationship at any time without direct financial penalty.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="post-footers"&gt;Dave Snowden  can produce plenty of examples where these conditions  were not met and outcome-based measures were disastrous.&lt;br /&gt;&lt;br /&gt;Tom Gilb can produce plenty of examples where these conditions were met and the results were excellent.&lt;br /&gt;&lt;br /&gt;Conclusions:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="post-footers"&gt;both Dave Snowden and Tom Gilb have something valuable to tell us!&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="post-footers"&gt;when we use measures to manage a supplier relationship, we must make sure that &lt;/span&gt;&lt;span class="post-footers"&gt;&lt;span style="font-style: italic;"&gt;either party must be able to terminate the relationship at any time without direct financial penalty.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="post-footers"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-5808198588120721379?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/5808198588120721379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=5808198588120721379' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5808198588120721379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/5808198588120721379'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2006/12/is-measurement-evil.html' title='Is measurement evil?'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-6538249390947579370</id><published>2006-11-28T16:17:00.000Z</published><updated>2006-11-28T16:49:20.140Z</updated><title type='text'>XPDay6 - better than ever...</title><content type='html'>&lt;a href="http://www.xpday.org/"&gt;XPDay6&lt;/a&gt; is nearly over, and it's been great.&lt;br /&gt;&lt;br /&gt;One of my favorite sessions was &lt;a href="http://www.clarkeching.com/"&gt;Clarke Ching's&lt;/a&gt; &lt;a href="http://beta.blogger.com/post-create.g?blogID=9053945#Embracing_Change:_An_Introduction_to"&gt;Embracing Change: An Introduction to Agile Software Development&lt;/a&gt;. Clarke has given similar presentations at XPDay for several years. They've all been good and they keep getting better.&lt;br /&gt;&lt;br /&gt;Another  was a goldfish bowl session Facilitated by &lt;a href="http://nat.truemesh.com/"&gt;Nat Pryce&lt;/a&gt; and Jonathan Clarke asking &lt;a href="http://beta.blogger.com/post-create.g?blogID=9053945#Why_Is_Simple_So_Difficult_Facilitated"&gt;Why Is Simple So Difficult?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's hard to define simplicity; it's much easier to define or detect complexity (and then avoid it).&lt;br /&gt;&lt;br /&gt;Lots of good ideas in the session; I liked &lt;a href="http://joe.truemesh.com/blog/"&gt;Joe Walnes&lt;/a&gt;' comment that you shouldn't &lt;span style="font-style: italic;"&gt;do&lt;/span&gt; the simplest thing - you should &lt;span style="font-style: italic;"&gt;have &lt;/span&gt;the simplest thing (but it may be very difficult creating that simple thing).&lt;br /&gt;&lt;br /&gt;I introduced Roy Sykes' 3am rule. This defines what I call simple code. It's the sort of code you'd hope to find if you have been called out of bed at 3am to fix a critical defect in production code.&lt;br /&gt;&lt;br /&gt;My favorites session today was on &lt;a href="https://lift.dev.java.net/"&gt;LiFT&lt;/a&gt; - a framework for literate testing. It can be used as an alternative to &lt;a href="http://fit.c2.com/"&gt;FIT&lt;/a&gt;, but it can also be used to implement readable FIT fixtures. I'm hoping to give it a spin on my current project.&lt;br /&gt;&lt;br /&gt;I really enjoyed the pub session afterwards. (Thanks, &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt;). Quote of the day - to Angela Martin, as she was taking photos of us all:&lt;br /&gt;&lt;br /&gt;"I see you're taking a picture of me while I'm sober. I hope you have a fast film."&lt;br /&gt;&lt;br /&gt;Ah well - off to the Old Bank Of England in Fleet Street for the post-conference &lt;a href="http://www.xpdeveloper.com/xpdwiki/Wiki.jsp?page=ExtremeTuesdayClub"&gt;Extreme Tuesday&lt;/a&gt; with more free drinks - thanks, &lt;a href="http://www.kizoom.com/"&gt;Kizoom&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-6538249390947579370?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/6538249390947579370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=6538249390947579370' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6538249390947579370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/6538249390947579370'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2006/11/xpday6-better-than-ever.html' title='XPDay6 - better than ever...'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-3776495242269876100</id><published>2006-11-20T13:34:00.000Z</published><updated>2006-11-20T13:38:08.436Z</updated><title type='text'>Factory methods can improve readability in embedded DSLs</title><content type='html'>&lt;a href="http://nat.truemesh.com/"&gt;Nat Pryce&lt;/a&gt; has just got rid of lots of explicit object creation from the interface to &lt;a href="http://sourceforge.net/projects/getinline"&gt;GetInLine&lt;/a&gt;; the embedded Domain Specific Language now reads much better.&lt;br /&gt;&lt;br /&gt;No new()s is goood news, in fact!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-3776495242269876100?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/3776495242269876100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=3776495242269876100' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/3776495242269876100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/3776495242269876100'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2006/11/factory-methods-can-improve-readability.html' title='Factory methods can improve readability in embedded DSLs'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-9104416712059119546</id><published>2006-11-15T07:56:00.000Z</published><updated>2006-11-15T08:09:02.642Z</updated><title type='text'>Facts and Fallacies of Software Engineering</title><content type='html'>I've just read &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0321117425/cockiandco-21"&gt;Facts and Fallacies of Software Engineering&lt;/a&gt; and I love it.&lt;br /&gt;&lt;br /&gt;My mate Bryan Dollery lent it to me after a chat in the pub about developer productivity. (Don't look so surprised. I do go the pub &lt;span style="font-style: italic;"&gt;occasionally&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;The book confirms many long-held opinions, and offers a lot of hard evidence ato support them. In particular, it spells out why a few skilled (and therefore expensive) developers can deliver business value much faster than a larger, less skilled team.&lt;br /&gt;&lt;br /&gt;I've started to write a couple of short articles on themes raised by the book. Watch this space.&lt;br /&gt;&lt;br /&gt;And thanks, Bryan, for an excellent read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-9104416712059119546?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/9104416712059119546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=9104416712059119546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/9104416712059119546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/9104416712059119546'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2006/11/facts-and-fallacies-of-software.html' title='Facts and Fallacies of Software Engineering'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-7832037027771635414</id><published>2006-11-14T17:05:00.000Z</published><updated>2006-11-14T17:51:15.753Z</updated><title type='text'>Ruby and Amazon Web Services</title><content type='html'>I've been ill at home for the last few days, but today I felt well enough to play a little. I built a really useful little command line application in Ruby. It's already saved the time it took to write it.&lt;br /&gt;&lt;br /&gt;It expects to find an ISBN in the clipboard. It checks that the ISBN is valid, uses the Amazon Web Service interface to get book details from an ISBN, and pastes the details to the clipboard, complete with an Amazon affiliate link. (If you buy the book after clicking on the link, I get a little money).&lt;br /&gt;&lt;br /&gt;A variant does the same thing, but copies the book details in a format ready to paste into &lt;a href="http://www.tiddlywiki.com/"&gt;TiddlyWiki&lt;/a&gt; which I use as an personal blog/wiki.&lt;br /&gt;&lt;br /&gt;I found out how to parse XML in Ruby by reading &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0976694069/cockiandco-21"&gt;Enterprise Integration with Ruby&lt;/a&gt;. (You can guess how I created that link, can't you?)&lt;br /&gt;&lt;br /&gt;Here's the &lt;a href="http://www.cocking.co.uk/downloads/ruby/getAmazonBookDetails.rb"&gt;Ruby code.&lt;/a&gt; To use it you will have to sign up for Amazon web services (if you haven't done so) and insert your access key into the code.&lt;br /&gt;&lt;br /&gt;Ruby rocks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-7832037027771635414?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/7832037027771635414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=7832037027771635414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7832037027771635414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/7832037027771635414'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2006/11/ruby-and-amazon-web-services.html' title='Ruby and Amazon Web Services'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-116275314396024503</id><published>2006-11-05T18:51:00.000Z</published><updated>2006-11-11T17:50:45.911Z</updated><title type='text'>GetInLine at SourceForge</title><content type='html'>The &lt;a href="http://sourceforge.net/projects/getinline"&gt;GetInLine&lt;/a&gt; file processing DSL is now hosted at SourceForge.  Code is in cvs and I've released an initial version (0.0.9).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cocking.co.uk/downloads/java/samples/getinline/ExtendedTest.java"&gt;Here's a sample test case&lt;/a&gt; that will give you a feeling for how to use it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-116275314396024503?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/116275314396024503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=116275314396024503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/116275314396024503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/116275314396024503'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2006/11/getinline-at-sourceforge.html' title='GetInLine at SourceForge'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-116254150569697561</id><published>2006-11-03T07:51:00.000Z</published><updated>2006-11-11T17:50:45.603Z</updated><title type='text'>Brain Quadrants updated</title><content type='html'>I'm still fascinated by &lt;a href="http://www.hbdi.com/home/index.cfm"&gt;Ned Herrmann's&lt;/a&gt; Brain Quadrant Theory.&lt;br /&gt;&lt;br /&gt;My colleague Chris Pollard points out that &lt;a href="http://www.cocking.co.uk/blog/2005/11/brain-quadrants-and-thinking-styles.html"&gt;my earlier blog post&lt;/a&gt; never listed the four core types of thinking in Herrman's model.&lt;br /&gt;&lt;br /&gt;Here they are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;logician&lt;/li&gt;&lt;li&gt;organizer&lt;/li&gt;&lt;li&gt;communicator &lt;span style="font-style: italic;"&gt;and&lt;/span&gt;&lt;/li&gt;&lt;li&gt;visionary.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;For a good introduction, read &lt;a href="http://www.hbdi.com/home/friendlyDownload.cfm?directory=100016_whitepapers&amp;actualFile=100159.pdf&amp;amp;saveName=The-Brains-Behind-Your-Organization%27s-Success-.pdf"&gt;Herrman's overview&lt;/a&gt; (pdf).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-116254150569697561?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/116254150569697561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=116254150569697561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/116254150569697561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/116254150569697561'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2006/11/brain-quadrants-updated.html' title='Brain Quadrants updated'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-116160771702373404</id><published>2006-10-23T13:32:00.000+01:00</published><updated>2006-11-11T17:50:45.139Z</updated><title type='text'>DSL for file processing - GetInLine</title><content type='html'>I've been playing with an embedded Domain-specific language for file processing. It grew out of a requirement from my current project, but I've already found a use for it in a couple of personal tasks.&lt;br /&gt;&lt;br /&gt;Tha language is growing and changing fast, but here's a code snippet that may give you a feel for what it can do already:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public void testIncludingFiltersOutRecordsThatDoNotMatchACondition() throws Exception {&lt;br /&gt; new Source().&lt;br /&gt; fromFile("docs/sample-data/flights3.txt").&lt;br /&gt; upToTheEnd().&lt;br /&gt; counting(allRecords).&lt;br /&gt; withoutBlankLines().&lt;br /&gt; counting(nonBlankRecords).&lt;br /&gt; allowing(Processing.rule().&lt;br /&gt;  accepting(1).&lt;br /&gt;  including(terminalRecordPattern).&lt;br /&gt;  populatingList(&lt;br /&gt;  terminals,&lt;br /&gt;  terminalFactory,&lt;br /&gt;  regexParser),&lt;br /&gt;   Processing.rule().&lt;br /&gt;  including(detailRecordPattern).&lt;br /&gt;  populatingList(&lt;br /&gt;   flights,&lt;br /&gt;   flightFactory,&lt;br /&gt;   commaDelimitedParser))&lt;br /&gt;  .read();&lt;br /&gt;  &lt;br /&gt; assertEquals(1, terminals.size());&lt;br /&gt; assertEquals(4, flights.size());&lt;br /&gt; assertEquals(6, allRecords.getCount());&lt;br /&gt; assertEquals(5, nonBlankRecords.getCount());&lt;br /&gt; checkEntry(0, "BA123", "Glasgow", "09:45");&lt;br /&gt; checkEntry(2, "BM435", "Bradford", "10:40");&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;which will read this file and create objects from it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;Terminal 1&lt;br /&gt;&lt;br /&gt;BA123,Glasgow,09:45&lt;br /&gt;IB236,Barcelona,10:20&lt;br /&gt;BM435,Bradford,10:40&lt;br /&gt;KL326,Amsterdam (Schipol),11:00&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-116160771702373404?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/116160771702373404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=116160771702373404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/116160771702373404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/116160771702373404'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2006/10/dsl-for-file-processing-getinline.html' title='DSL for file processing - GetInLine'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-115175349471121364</id><published>2006-07-01T11:29:00.000+01:00</published><updated>2006-11-11T17:50:44.921Z</updated><title type='text'>Callisto appears on schedule</title><content type='html'>Yesterday the &lt;a href="http://www.eclipse.org/"&gt;Eclipse project&lt;/a&gt; released &lt;a href="http://www.eclipse.org/callisto/"&gt;Callisto&lt;/a&gt;. Callisto is a simultaneous release of 10 related Eclipse projects, including Eclipse 3.2.&lt;br /&gt;&lt;br /&gt;One of the projects is &lt;a href="http://www.eclipse.org/gmf/"&gt;GMF&lt;/a&gt;, the Eclipse Graphical Modelling Framework. GMF is a &lt;span style="font-style: italic;"&gt;very &lt;/span&gt;high-level tool for building Graphical Editors for Domain-Specific Languages (DSLs). GMF is what Martin Fowler calls a &lt;a href="http://www.martinfowler.com/articles/languageWorkbench.html"&gt;Language Workbench&lt;/a&gt;. I'll be reporting on my experiences with the latest release of GMF over the next few days.&lt;br /&gt;&lt;br /&gt;I've also been following two similar projects, one from JetBrains and one from Microsoft.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jetbrains.com/"&gt;JetBrains &lt;/a&gt;have just announced an &lt;a href="http://www.jetbrains.net/confluence/display/MPS/Welcome+to+JetBrains+MPS+Early+Access+Program"&gt;Early Access Programme&lt;/a&gt; for their &lt;a href="http://www.jetbrains.com/mps/"&gt;Meta Programming System&lt;/a&gt;. I've not yet started to play with it, but  I will. Given the outstanding usability of &lt;span style="font-style: italic;"&gt;IntelliJ Idea&lt;/span&gt;, this is likely be an outstanding product.&lt;br /&gt;&lt;br /&gt;Steve Cook and Alan Cameron-Wills are busy building &lt;a href="http://msdn.microsoft.com/vstudio/DSLTools/"&gt;DSL tools&lt;/a&gt; at Microscoft. As you'd expect, they are based on VS2005, and tie in with Microsoft's Software Factory strategy. I'm much less productive when using VS2005  than I am using Eclipse or Idea, but Microsoft initiatives can't be ignored and the authors are world-class experts.&lt;br /&gt;&lt;br /&gt;Back to Callisto. The team at Eclipse turned the Callisto release into a real cliff-hanger. The relase date had been announced well in advance, and for several days the Callisto web-page showed a ticking countdown.&lt;br /&gt;&lt;br /&gt;Yesterday I watched the release clock tick down to zero, to be replaced by a banner reading "You're too late!". This was (fairly) quickly replaced by a banner saying Callisto was coming soon; then an additonal "no really, we promise"; then a banner saying "packing up the bits"; "distributiong to mirrors"; and finally, late yesterday evening UK time, the download was released.&lt;br /&gt;&lt;br /&gt;Someone at Eclipse has a fine sense of the dramatic!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-115175349471121364?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/115175349471121364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=115175349471121364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/115175349471121364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/115175349471121364'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2006/07/callisto-appears-on-schedule.html' title='Callisto appears on schedule'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-113171905865016874</id><published>2005-11-11T14:04:00.000Z</published><updated>2006-11-11T17:50:43.146Z</updated><title type='text'>Brain Quadrants and Thinking Styles</title><content type='html'>Have you wondered why some of the people you work with just don't seem to get things that are blindingly obvious to &lt;span style="font-style: italic;"&gt;you&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;One possible explanation is that their preferred &lt;span style="font-style: italic;"&gt;style of thinking&lt;/span&gt; is diametrically opposed to yours.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0070284628/cockiandco-21"&gt;Whole Brain Business Book&lt;/a&gt; by &lt;a href="http://www.hbdi.com/"&gt;Ned Herrmann&lt;/a&gt; suggests that there are &lt;span style="font-style: italic;"&gt;four core thinkng styles&lt;/span&gt; based on four distinct parts of the brain.&lt;br /&gt;&lt;br /&gt;You've probably read about &lt;a href="http://www.rogersperry.info/"&gt;Roger Sperry's&lt;/a&gt; Nobel prize winning experiments which showed that the left and right sides of the brain have distinct and complementary functions.&lt;br /&gt;&lt;br /&gt;Herrmann takes Sperry's idea further by also distinguishing between brain functions located in the &lt;a href="http://en.wikipedia.org/wiki/Cerebral_cortex"&gt;&lt;span style="font-style: italic;"&gt;cortex&lt;/span&gt;&lt;/a&gt; and and those based in the &lt;a href="http://www.ship.edu/%7Ecgboeree/limbicsystem.html"&gt;&lt;span style="font-style: italic;"&gt;limbic system&lt;/span&gt;&lt;/a&gt;. The cortex is a relatively new part of the brain in evolutionary terms; the limbic system evolved much earlier.&lt;br /&gt;&lt;br /&gt;Herrmann classifies brain functions within a four part (quadrant) model depending on whether they are located on the left or right, and in the cortext or limbic system.&lt;br /&gt;&lt;br /&gt;According to Herrmann, we have personal preferences for one or more quadrants. These preferences have profound effects on how we think, learn and interact with others.&lt;br /&gt;&lt;br /&gt;Our preferences can be modified by practice, and the book suggests activities that you can use to develop the functions of each quadrant.&lt;br /&gt;&lt;br /&gt;The book includes a simple guide that helps you to establish your own preferences, and explores the consequences of different thinking styles.&lt;br /&gt;&lt;br /&gt;I found something of value in each chapter but I was most excited by &lt;span style="font-style: italic;"&gt;Whole Brain Products&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Whole Brain Training and Development&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;If you're interested in how you think, learn or work with others, this book offers a fascinating and thought-provoking model for you to explore.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-113171905865016874?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/113171905865016874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=113171905865016874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/113171905865016874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/113171905865016874'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/11/brain-quadrants-and-thinking-styles.html' title='Brain Quadrants and Thinking Styles'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112573430535432852</id><published>2005-09-03T08:51:00.000+01:00</published><updated>2006-11-11T17:50:42.602Z</updated><title type='text'>A neat improvement to JUnit testing</title><content type='html'>&lt;a href="http://joe.truemesh.com/blog/"&gt;Joe Walnes&lt;/a&gt; has posted a &lt;a href="http://joe.truemesh.com/blog//000511.html"&gt;neat way to simplify and improve tests&lt;/a&gt; with &lt;a href="http://www.junit.org/index.htm"&gt;JUnit&lt;/a&gt;. His technique borrows classes from &lt;a href="http://www.jmock.org/"&gt;JMock&lt;/a&gt;, but doesn't require you to use Mock Objects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112573430535432852?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112573430535432852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112573430535432852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112573430535432852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112573430535432852'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/09/neat-improvement-to-junit-testing.html' title='A neat improvement to JUnit testing'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112573177114410098</id><published>2005-09-03T07:46:00.000+01:00</published><updated>2006-11-11T17:50:42.394Z</updated><title type='text'>SableCC v3 and Domain Specific Languages</title><content type='html'>If you're trying to build a &lt;a href="http://www.martinfowler.com/articles/languageWorkbench.html#ExternalDsl"&gt;external DSL&lt;/a&gt;, you'll need to write a compiler for it. If the language is non-trivial, you will probably want to use a parser generator. One of the best is &lt;a href="http://sablecc.org/"&gt;SableCC&lt;/a&gt;, which deserves to be better known.&lt;br /&gt;&lt;br /&gt;Nat Pryce (of &lt;a href="http://www.jmock.org/"&gt;JMock&lt;/a&gt; and &lt;a href="http://xspecs.sourceforge.net/oomatron.html"&gt;OO-Matron&lt;/a&gt; fame) has written an &lt;a href="http://nat.truemesh.com/archives/000531.html"&gt;excellent introduction to SableCC version 3.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been using v2 of SableCC for a couple of years to compile the &lt;a href="http://www.bcs-oops.org.uk/resources/mdaday/Cocking-DSLViaMDA.pdf"&gt;DSL for the SmartRec project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At the time I started work on SmartRec, v3 of SableCC was still unstable and the documentation was minimal. I decided to stick with V2, which was recommended for production applications.&lt;br /&gt;&lt;br /&gt;I got off to a very quick start. Sadly, as the DSL got more sophisiticated my compiler got more brittle. I've been looking for a good solution for a while. Nat's article has given me one. Thanks, Nat!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112573177114410098?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112573177114410098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112573177114410098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112573177114410098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112573177114410098'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/09/sablecc-v3-and-domain-specific.html' title='SableCC v3 and Domain Specific Languages'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112559088841919044</id><published>2005-09-01T17:00:00.000+01:00</published><updated>2006-11-11T17:50:42.195Z</updated><title type='text'>XP version 2, Mocking and more at the Agile Academy</title><content type='html'>I forgot to this before my holidays, so its kinda late in the day - but there is a really good series of courses on in London next week.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.agileacademy.net/summer/index.php"&gt;Agile Academy Summer School&lt;/a&gt; runs from Monday 5th to Friday 9th September.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Agenda&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Day 1: &lt;a href="http://www.agileacademy.net/summer/introxpv2.php"&gt;Introduction to programming with XP version 2&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Day 2: &lt;a href="http://www.agileacademy.net/summer/robocode.php"&gt;Putting XP into practice with RoboCode&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Day 3: &lt;a href="http://www.agileacademy.net/summer/mockobjects.php"&gt;Advanced Test-First with Mock Objects&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Day 4: &lt;a href="http://www.agileacademy.net/summer/testingfit.php"&gt;Acceptance Testing with Fit and Fit Library&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Day 5: &lt;a href="http://www.agileacademy.net/summer/buildautomation.php"&gt;Automation of Builds and Deployment&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;They &lt;span style="font-style: italic;"&gt;may&lt;/span&gt; still have some places free (but at this notice you may have to bring your own sandwiches).&lt;br /&gt;&lt;/p&gt; &lt;p&gt;The presenters are leading lights in the AgileCommunity and the courses will be very hands-on. Strongly recommended.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Apologies for posting this so late!&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/9053945-112559088841919044?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112559088841919044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112559088841919044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112559088841919044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112559088841919044'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/09/xp-version-2-mocking-and-more-at-agile.html' title='XP version 2, Mocking and more at the Agile Academy'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112558909182236009</id><published>2005-09-01T16:28:00.000+01:00</published><updated>2006-11-11T17:50:41.880Z</updated><title type='text'>Better ways to find and satisfy requirements.</title><content type='html'>If you're interested in better ways to build better systems, you should take a look at the courses that Tom Gilb and Kai Gilb will be teaching in London this October.&lt;br /&gt;&lt;br /&gt;Titles include Requirement Specification (two day), Evolutionary Project Management (two day) and Agile Inspection (one day).&lt;br /&gt;&lt;br /&gt;Tom's new book on Competitive Engineering has had glowing reviews (not just from me :-) and the courses will give you a chance to learn how to apply key techniques directly from the author.&lt;br /&gt;&lt;br /&gt;You can find out more at the &lt;a href="http://www.testing-solutions.com/gilb/"&gt; testing solutions group&lt;/a&gt; website.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112558909182236009?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112558909182236009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112558909182236009' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112558909182236009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112558909182236009'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/09/better-ways-to-find-and-satisfy.html' title='Better ways to find and satisfy requirements.'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112556122364767898</id><published>2005-09-01T08:16:00.000+01:00</published><updated>2006-11-11T17:50:41.588Z</updated><title type='text'>Saxon rocks!  My XSLT transformations are now 20 times faster.</title><content type='html'>I'm currently developing a tailored course for one of my major clients. I use an &lt;a href="http://www.cocking.co.uk/blog/2005/08/fun-with-xslt-no-really.html"&gt;XSLT pipleline&lt;/a&gt; to convert a huge &lt;a href="http://www.mind-map.com/EN/mindmaps/how_to.html"&gt;Mind Map&lt;/a&gt; into pdf and html student notes .&lt;br /&gt;&lt;br /&gt;As the course takes shape, the Mind Map has been getting larger and the conversion has been taking longer.  Yesterday evening the  publishing task ran for four and a half minutes - too slow for an agile developer like me!&lt;br /&gt;&lt;br /&gt;Today I switched from &lt;a href="http://xml.apache.org/xalan-j/"&gt;XALAN&lt;/a&gt; to &lt;a href="http://www.saxonica.com/"&gt;Saxonica&lt;/a&gt;'s Saxon 8. The  publishing  task now takes  43 seconds, of which more than half is spent outside XSLT.  The XSLT processing now runs &lt;span style="font-style: italic;"&gt;20 times faster&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;I'm opening a lot of output documents in the slowest stylesheet, which may be the problem.  You may not get the same speed-up in your applications.  I'll do some more timings and report them here.&lt;br /&gt;&lt;br /&gt;Saxon is developed by Michael Kay, the author of the &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0764569090/cockiandco-21"&gt;XSLT 2.0 Programmer's reference&lt;/a&gt;. Michael has also played a key role in the development of the XSLT 1.0 and 2.0 specifications. Saxon comes in two versions; I'm using the free open source variety, but there is also a commercial schema aware version.&lt;br /&gt;&lt;br /&gt;I also use the XSLT 2.0 engine/debugger in &lt;a href="http://www.altova.com/"&gt;Altova&lt;/a&gt;'s XML Spy. It's not open-source, but there is a &lt;a href="http://www.altova.com/download_spy_home.html"&gt;free home edition&lt;/a&gt; and you can download the &lt;a href="http://www.altova.com/altovaxml.html"&gt;Altova XSLT&lt;/a&gt; engine separately (also free).&lt;br /&gt;&lt;br /&gt;Saxon was the first widely available  implementation of XSLT 2.0.  It's functional and fast. If you're doing heavy-duty XSLT transformation, or need an open-source XSLT 2.0 engine, I  strongly recommend it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112556122364767898?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112556122364767898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112556122364767898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112556122364767898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112556122364767898'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/09/saxon-rocks-my-xslt-transformations.html' title='Saxon rocks!  My XSLT transformations are now 20 times faster.'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112488758390845218</id><published>2005-08-24T13:21:00.000+01:00</published><updated>2006-11-11T17:50:41.383Z</updated><title type='text'>Topic Maps and .Net</title><content type='html'>Take a look at &lt;a href="http://msdn.microsoft.com/architecture/journ/default.aspx?pull=/library/en-us/dnmaj/html/Jour5Intro.asp"&gt;An Introduction to Topic Maps&lt;/a&gt; on msdn. It's written by Kal Ahmed and Graham Moore of &lt;a href="http://www.networkedplanet.com/"&gt;Networked Planet&lt;/a&gt;. It's more informative and more up-to-date than the &lt;a href="http://www.cocking.co.uk/doc1/design-3.htm"&gt;introduction on my website&lt;/a&gt; :-(&lt;br /&gt;&lt;br /&gt;&lt;a href="mailto:kal@techquila.com"&gt;Kal Ahmed&lt;/a&gt; has been heavily involved in &lt;a href="http://www.tm4j.org/"&gt;TM4j&lt;/a&gt;, an open source implementation of the &lt;a href="http://www.tmapi.org/"&gt;Topic Map API&lt;/a&gt;. Graham and he have now created a (commercial) &lt;a href="http://www.networkedplanet.com/news/tmcore-de-announce.html"&gt;TMCore topic map engine for .NET&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been playing with Topic Maps for a while now. Topic Mapping has incredible potential as a technique for knowledge creation and dissemination, but uptake has been slow. Let's hope that interest from the Microsoft developer community will be the trigger for liftoff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112488758390845218?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112488758390845218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112488758390845218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112488758390845218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112488758390845218'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/08/topic-maps-and-net.html' title='Topic Maps and .Net'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112480849684584781</id><published>2005-08-23T15:23:00.000+01:00</published><updated>2006-11-11T17:50:41.123Z</updated><title type='text'>MindJet, .Net and the Mac</title><content type='html'>I'm not given to conspiracy theory, but I know that well-known companies sometimes have big secrets. Like me, you probably like to guess those secrets, and sometimes get them right.&lt;br /&gt;&lt;br /&gt;You're about to read my latest wild guess.&lt;br /&gt;&lt;br /&gt;First, though, I need to set the scene. For years I've used a program called &lt;a href="http://www.mindjet.com/"&gt;MindManager&lt;/a&gt; to create &lt;a href="http://www.mind-map.com/EN/mindmaps/how_to.html"&gt;Mind Maps&lt;/a&gt; on my computer. (Thanks to &lt;a href="http://www.twelve71.org/blogs/rachel/archives/000813.html"&gt;Rachel Davies&lt;/a&gt; for the latter link). Mind Manager is not the only Mind Mapping Software, but it's probably the most widely used. It's well integrated with Windows, but is currently only available on that platform.&lt;br /&gt;&lt;br /&gt;A few days ago a message on the MindManager Yahoo Group mentioned that MindJet, the makers of MindManager, were recruiting developers with Mac experience.&lt;br /&gt;&lt;br /&gt;I can only see two plausible explanations for this,and one of them is &lt;span style="font-style: italic;"&gt;mindblowing.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The boring one is that MindJet are really worried about NovaMind, which is a Mind Mapping program that runs on the Mac and will soon be available for Windows. The folks at MindJet might be willing to create a second codebase for their product, but I doubt it. I don't think they are that dumb.&lt;br /&gt;&lt;br /&gt;The second explanation is that they know something that we don't. That's not unlikely, as MindJet have a very close relationship with Microsoft.&lt;br /&gt;&lt;br /&gt;When the &lt;a href="http://www.thinksecret.com/news/0506intelmac.html"&gt;Mac makes its move to Intel hardware&lt;/a&gt;, is it possible that we'll also see &lt;span style="font-weight: bold;"&gt;.Net for the Mac OS&lt;/span&gt;&lt;a href="http://www.thinksecret.com/news/0506intelmac.html"&gt;&lt;/a&gt;?&lt;br /&gt;&lt;a href="http://finance.groups.yahoo.com/group/mindmanager/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112480849684584781?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112480849684584781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112480849684584781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112480849684584781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112480849684584781'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/08/mindjet-net-and-mac.html' title='MindJet, .Net and the Mac'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112473194788863288</id><published>2005-08-22T18:10:00.000+01:00</published><updated>2006-11-11T17:50:40.928Z</updated><title type='text'>It's not XML - it's not YAML - it's SPaML!</title><content type='html'>I'm currently working on a project that requires a lot of &lt;a href="http://www.w3.org/TR/xslt20/"&gt;XSLT 2.0 transformations.&lt;/a&gt; Since I'm doing &lt;a href="http://www.agiledata.org/essays/tdd.html"&gt;Test Driven Development&lt;/a&gt;, I am relying heavily on &lt;a href="http://xmlunit.sourceforge.net/"&gt;XMLUnit&lt;/a&gt;. (Bless you, &lt;a href="http://coachspot.blogspot.com/"&gt;Tim&lt;/a&gt; and &lt;a href="http://www.custommonkey.org/words/jeff/"&gt;Jeff&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;However, I've been spending more time than I want to writing XML test documents.&lt;br /&gt;&lt;br /&gt;So I created SPaML - the Simplest Possible Markup Language. It's very concise, and allows me to specify a complex document in a short line of text.&lt;br /&gt;&lt;br /&gt;Here's a SPaML document (quoted, as it would be in a &lt;a href="http://junit.org/"&gt;JUnit&lt;/a&gt; TestCase):&lt;br /&gt;&lt;br /&gt;"(map file=foo(branch id=0(branch id=1(text{bar}))(branch id=2)))"&lt;br /&gt;&lt;br /&gt;The corresponding XML is about three times as long, with escaped quotes. Horrid to read, tedious to write, and very error prone. Don't you just love it when you've got bugs in your test data!&lt;br /&gt;&lt;br /&gt;I've written a SPaML converter in &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt;, and will probably port it to &lt;a href="http://msdn.microsoft.com/vcsharp/"&gt;C#&lt;/a&gt;.&lt;br /&gt;If anyone is interested, drop me a note: romilly(at)cocking.co.uk&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112473194788863288?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112473194788863288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112473194788863288' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112473194788863288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112473194788863288'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/08/its-not-xml-its-not-yaml-its-spaml.html' title='It&apos;s not XML - it&apos;s not YAML - it&apos;s SPaML!'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112386484939916184</id><published>2005-08-12T17:29:00.000+01:00</published><updated>2006-11-11T17:50:40.629Z</updated><title type='text'>Competitive Engineering hits the bookshops!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cocking.co.uk/blog/uploaded_images/CE-726239.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.cocking.co.uk/blog/uploaded_images/CE-711035.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.gilb.com/"&gt;Tom Gilb&lt;/a&gt; skyped me this morning to tell me that his latest book "Competitive Engineering" has hit the bookshops.&lt;br /&gt;&lt;br /&gt;There's a (five star)  &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0750665076/cockiandco-21/"&gt;review on Amazon.co.uk&lt;/a&gt;; you can view my (five star) &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0750665076/cockandcoltd-20"&gt;review on Amazon.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112386484939916184?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112386484939916184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112386484939916184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112386484939916184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112386484939916184'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/08/competitive-engineering-hits-bookshops.html' title='Competitive Engineering hits the bookshops!'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112386369067871327</id><published>2005-08-12T17:16:00.000+01:00</published><updated>2006-11-11T17:50:40.398Z</updated><title type='text'>New SmartArrays website</title><content type='html'>&lt;a href="http://www.smartarrays.com/"&gt;SmartArrays&lt;/a&gt;, Inc.  have just finished a remake of their website. There's a lot of new information there, including a new interactive &lt;a href="http://www.smartarrays.com/tutorials.aspx"&gt;tutorial&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112386369067871327?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112386369067871327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112386369067871327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112386369067871327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112386369067871327'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/08/new-smartarrays-website.html' title='New SmartArrays website'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112366569193466589</id><published>2005-08-10T10:03:00.000+01:00</published><updated>2006-11-11T17:50:40.226Z</updated><title type='text'>eXtremely enjoyable Tuesday</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cocking.co.uk/blog/uploaded_images/XtC-727396.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.cocking.co.uk/blog/uploaded_images/XtC-723045.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;One of the things I'll miss most if I ever move out of London is the &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.xpdeveloper.com/xpdwiki/Wiki.jsp?page=ExtremeTuesdayClub"&gt;Extreme Tuesday Club.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;It's a goup of great people who get together when they can (on Tuesdays, as you might have guessed) at the &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.xpdeveloper.com/xpdwiki/Wiki.jsp?page=TheOldBankOfEngland"&gt;Old Bank Of England pub&lt;/a&gt;&lt;span style="font-family:arial;"&gt; in Fleet Street.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;If you're a regular you can be sure of meeting old friends and making new ones. If you're a first-timer you can be sure of a warm welcome. Everyone seems to share a thirst for learning and a love of sharing what they already know. The regulars include some very experienced developers.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;It's a great way to find out what's going on in the Agile community. Last night Peter Brown announced &lt;/span&gt;&lt;a style="font-family: arial;" href="http://xpday5.xpday.org/wiki/index.php/Main_Page"&gt;XPDay5&lt;/a&gt;&lt;span style="font-family:arial;"&gt; - a two day international conference about Agile Software Development for software developers, project leaders, IT managers, testers, architects, and coaches.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I went to XPDay4 last year and loved it. This year XPDay5 will take place on Monday 28th &amp; Tuesday 29th November, 2005 in London, U.K. &lt;span style="font-weight: bold;"&gt;Recommended!&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-112366569193466589?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112366569193466589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112366569193466589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112366569193466589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112366569193466589'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/08/extremely-enjoyable-tuesday.html' title='eXtremely enjoyable Tuesday'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-112359835413998713</id><published>2005-08-09T15:07:00.000+01:00</published><updated>2006-11-11T17:50:39.936Z</updated><title type='text'>Fun with XSLT - no, really!</title><content type='html'>&lt;span style="font-family:arial;"&gt;I've been having a lot of fun with XSLT recently.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I'm currently working on a customised course for a banking client. (No, not the French one). Over the last couple of years I have been gradually refining a course publishing framework that takes a MindMap and turns it into courseware. The framework works pretty well, but I still need to create lots of graphics.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Trouble is, I hate using drawing editors.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I'd much rather just describe the picture that I want in text and then have a piece of software draw the diagrams for me. Fortunately there are several Open Source tools that can help; one of my favorites is &lt;/span&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;dot&lt;/span&gt;&lt;span style="font-family:arial;"&gt; (part of the &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.graphviz.org/"&gt;GraphViz&lt;/a&gt;&lt;span style="font-family:arial;"&gt; package) . Dot reads a text file that describes a directed or undirected graph in the dot language and then lays out the graph for you. It can export a variaty of formats, inclding svg which is what my framework prefers.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;The dot language is pretty intuitive, but it's a bit repetitive if you are creating lots of similar diagrams. Since I hate un-necessary repetition, I decided to create a little language for some of the most common diagrams that I needed.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Problem: how should I turn my little language into a dot file? Normally I would use a compiler compiler to do this - fun, but not quite trivial. A few days ago I stumbled on &lt;a href="http://www.idealliance.org/proceedings/xml04/papers/111/mhk-paper.html"&gt;an article by Michael Kay&lt;/a&gt; which showed how to use regular expressions and the new unparsed-text capabilities of XSLT 2.0 to turn text files into XML. It's then very easy to get XSLT to generate a new text file in dot format.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Here's a short sample input file:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;data xml "XML\ndocument"&lt;br /&gt;text txt "Unparsed text\ndocument"&lt;br /&gt;data out "XML, HTML or text\ndocument"&lt;br /&gt;program xsl "XSL\nStylesheet"&lt;br /&gt;process XSLT "XSLT 2.0\nProcessor"&lt;br /&gt;input from xml to XSLT&lt;br /&gt;unparsed from txt to XSLT&lt;br /&gt;code from xsl to XSLT&lt;br /&gt;output from XSLT to out&lt;/blockquote&gt;&lt;span style="font-family:arial;"&gt;Here's the dot language file that's generated:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;digraph process{&lt;br /&gt; node[shape=Mrecord]&lt;br /&gt;xml[label="XML\ndocument" shape=box]&lt;br /&gt;txt[label="Unparsed text\ndocument" shape=box color=brown]&lt;br /&gt;out[label="XML, HTML or text\ndocument" shape=box]&lt;br /&gt;xsl[label="XSL\nStylesheet" shape=invhouse]&lt;br /&gt;XSLT[label="{{XSLT|ANT task}|XSLT 2.0\nProcessor}" ]&lt;br /&gt;xml -&gt; XSLT&lt;br /&gt;txt -&gt; XSLT[color=brown]&lt;br /&gt;xsl -&gt; XSLT[color=gray]&lt;br /&gt;XSLT -&gt; out&lt;br /&gt; { rank=same; txt; xsl; }&lt;br /&gt; { rank=same; xml; out; XSLT; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;span style="font-family:arial;"&gt;And here's the output as a jpeg image:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cocking.co.uk/blog/uploaded_images/xsl2-725528.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.cocking.co.uk/blog/uploaded_images/xsl2-718074.jpg" alt="" 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/9053945-112359835413998713?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/112359835413998713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=112359835413998713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112359835413998713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/112359835413998713'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2005/08/fun-with-xslt-no-really.html' title='Fun with XSLT - no, really!'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-110016323836638792</id><published>2004-11-11T07:50:00.000Z</published><updated>2006-11-11T17:50:39.650Z</updated><title type='text'>Why agile development and outsourcing don't mix</title><content type='html'>If you're involved in IT you must be aware of two trends in the market - the move to more agile methods of application development, and the move by large enterprises to outsource more and more.&lt;br /&gt;&lt;br /&gt;I believe that there is a fundamental conflict between these two trends, as do many of the gurus of the agile world. (For example, read Scott Ambler's article &lt;span style="font-style: italic;"&gt;Outsourcing Examined&lt;/span&gt; in the April 2003 issue of &lt;a href="http://www.sdmagazine.com/"&gt;Software Development Magazine&lt;/a&gt; ).&lt;a href="http://www.martinfowler.com/"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The most important factor in agile IT projects is the quality of communication. (See Alistair Cockburn's &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0201699699/"&gt;&lt;span style="font-style: italic;"&gt;Agile Software Development&lt;/span&gt;&lt;/a&gt;).That includes communication within the team and communication between the team and outside stakeholders.&lt;br /&gt;&lt;br /&gt;We can assess the quality of communication in terms of a few key measures. These measures are the same as those you would use to assess an electronic communications network. The measures are&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Bandwidth&lt;/li&gt;   &lt;li&gt;Latency&lt;/li&gt;   &lt;li&gt;Reliability&lt;/li&gt;   &lt;li&gt;Availabity&lt;/li&gt; &lt;/ul&gt; Of these measures, we want latency to be low and the others to be high.&lt;br /&gt;&lt;br /&gt;Let's look at these in relation to a spectrum of application development styles.&lt;br /&gt;&lt;br /&gt;At one end we have an &lt;span style="font-weight: bold;"&gt;XP team&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;All four measures are likely to be &lt;span style="font-weight: bold;"&gt;very good&lt;/span&gt;. The team members are physically close, so bandwidth is high and latency is low. Reliability of communication is high, not least because because the team is likely to develop a common &lt;span style="font-style: italic;"&gt;culture.&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt; &lt;/span&gt;By &lt;span style="font-style: italic;"&gt;culture&lt;/span&gt;, I mean the &lt;span style="font-style: italic;"&gt;customs,&lt;/span&gt; &lt;span style="font-style: italic;"&gt;conventions&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;codes &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;values &lt;/span&gt;that are shared by the team. These all help to make communication faster and more reliable.&lt;br /&gt;&lt;br /&gt;At the other end of the spectum we have an &lt;span style="font-weight: bold;"&gt;outsourced team&lt;/span&gt; that's located in another continent, and from a different company.&lt;br /&gt;&lt;br /&gt;All four measures are likely to be &lt;span style="font-weight: bold;"&gt;very bad&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Bandwith is low. If we use email to communicate, we lose about 95% of the information our brains get when we interact with someone within touching distance.&lt;br /&gt;&lt;br /&gt;Latency is high. If the person we want to interact with is available only via email and is seven time zones away, we may need to wait for 18 hours for a reply even if the person we're interacting with replies as soon as they see our email. If they are busy, or want to avoid the issue we've raised, we may have to wait much longer.&lt;br /&gt;&lt;br /&gt;Reliablilty is low, both for technical reasons and because our cultures are different.&lt;br /&gt;&lt;br /&gt;Availability is low. In the most extreme case, some countries pretty much close down for two weeks or more in the summer!&lt;br /&gt;&lt;br /&gt;While this is an extreme example, &lt;span style="font-style: italic;"&gt;any&lt;/span&gt; outsourced development will suffer from a significant degradation of all four measures of communication.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion: agility and outsourcing are incompatible.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anyone who tells you otherwise is probably trying to sell you something.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-110016323836638792?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/110016323836638792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=110016323836638792' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/110016323836638792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/110016323836638792'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2004/11/why-agile-development-and-outsourcing.html' title='Why agile development and outsourcing don&apos;t mix'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-110002432242756414</id><published>2004-11-09T18:04:00.000Z</published><updated>2006-11-11T17:50:39.416Z</updated><title type='text'>Wot - no SVG?</title><content type='html'>I've recently started using &lt;a href="http://www.smartdraw.com/"&gt;SmartDraw&lt;/a&gt; for some architectural diagrams in my current project. It's a nice piece of software - intuitive, simpler than Visio, and with a huge and useful library of templates. But &lt;span style="font-style: italic;"&gt;why won't it export &lt;a href="http://www.w3.org/Graphics/SVG/"&gt;scalable vector graphics (svg)&lt;/a&gt;?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I do most of my graphics in SVG &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt; these days. Because it's an XML language I can easily transform it or generate it from other XML documents. Because SmartDraw won't import or export SVG, it's hard to merge SmartDraw diagrams with documents that I've created previously. It's a surprising limitation in what is otherwise an excellent, if commercial, program.&lt;br /&gt;&lt;br /&gt;In my copious free time I'm planning  to take a look at an alternative called &lt;a href="http://www.inkscape.org/"&gt;Inkscape&lt;/a&gt;. I've heard good things about it. It uses SVG, and it's open source.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-110002432242756414?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/110002432242756414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=110002432242756414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/110002432242756414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/110002432242756414'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2004/11/wot-no-svg.html' title='Wot - no SVG?'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-109989879397773766</id><published>2004-11-08T07:25:00.000Z</published><updated>2006-11-11T17:50:38.982Z</updated><title type='text'>The plot thickens.</title><content type='html'>Yesterday I followed my own advice and installed Firefox. Things went pretty smoothly, except for two interesting problems.&lt;br /&gt;&lt;br /&gt;One became apparent immediately. Firefox had trouble importing my cookies, favourites and passwords from IE. Since IE was causing such intolerable problems after I installed XP SP2 that I decided to press on regardless.&lt;br /&gt;&lt;br /&gt;The other became apparent this morning when I tried to access my wish list at Amazon. (After all, Christmas is coming, and so is my birthday!). The XP SP2 firewall appears to block SSL from Firefox (but not Netscape or IE). As soon as I turned the firewall offI could access my account at Amazon again.&lt;br /&gt;&lt;br /&gt;Could SP2 be targetted at Firefox, designed to stop non-technical users from adopting an alternative to IE?&lt;br /&gt;&lt;br /&gt;Of course not. A moment's reflection on Microsoft's unblemished track record of concern for fair competition and openness  tells us that they would never stoop to such a trick.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-109989879397773766?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/109989879397773766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=109989879397773766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/109989879397773766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/109989879397773766'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2004/11/plot-thickens.html' title='The plot thickens.'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9053945.post-109984588368339373</id><published>2004-11-07T15:51:00.000Z</published><updated>2006-11-11T17:50:38.773Z</updated><title type='text'>OK - I give in..</title><content type='html'>Over the last few weeks I've felt that the whole world has been telling me that I need to blog.  Today I gave in.&lt;br /&gt;&lt;br /&gt;Setting one up has taken longer than it should do. That's in part because Mr Gates has blessed my laptop with XP Service pack 2 and now nothing with scripts in it works with IE.&lt;br /&gt;&lt;br /&gt;I've now created more mis-configured blogs on &lt;a href="http://www.blogger.com"&gt;blogger&lt;/a&gt; than you can shake a fist at, and I cannot currently delete them. (I'm not worried, though, becase the blogger site tells me that "engineers are aware of the problem" and will be fixing it Real Soon Now).&lt;br /&gt;&lt;br /&gt;I finally realised that I should have used Netscape, not IE, to set up the blog acount; as soon as I did everything worked fine.&lt;br /&gt;&lt;br /&gt;Has Microsoft shot itself in both feet with XP SP2? It stops so many things from working that even MS diehard fans (not to mention non-technical computer users) will consider migrating to &lt;a href="http://www.netscape.com/"&gt;Nestcape&lt;/a&gt; or &lt;a href="http://www.mozilla.org/products/firefox/"&gt;Firefox&lt;/a&gt;. All we need now is a similarly disruptive service pack for another widely-used product and Linux will positively fly onto everyone's desktop.&lt;br /&gt;&lt;br /&gt;Memo to self - download and install Firefox today, and make it my default browser.&lt;br /&gt;&lt;br /&gt;Second memo to self. How hard would it be to migrate all our desktop machines to Linux? Our three production servers already run Linux, and we could use &lt;a href="http://www.vmware.com/"&gt;VMWare&lt;/a&gt; to keep any non-portable Windows apps available.&lt;br /&gt;&lt;br /&gt;There are plenty of signs that Microsoft is really concerned about the threat from Linux. If their &lt;a href="http://www.microsoft.com/uk/getthefacts/default.mspx"&gt;comparison of TCO for Linux and Windows&lt;/a&gt; doesn't convince you, take a look at their &lt;a href="http://www.sec.gov/Archives/edgar/data/789019/000119312504150689/d10k.htm#toc11190_11"&gt;annual  filing with the SEC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then try the simple test below.&lt;br /&gt;&lt;br /&gt;Question: In how many of their main markets does Microsoft indicate that they face significant competition from Open Source Software (OSS) , or software derived from OSS?&lt;br /&gt;&lt;br /&gt;Answer: In 5 out of 7, including the client (desktop) software market.&lt;br /&gt;&lt;br /&gt;How sad.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9053945-109984588368339373?l=romillycocking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://romillycocking.blogspot.com/feeds/109984588368339373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9053945&amp;postID=109984588368339373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/109984588368339373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9053945/posts/default/109984588368339373'/><link rel='alternate' type='text/html' href='http://romillycocking.blogspot.com/2004/11/ok-i-give-in.html' title='OK - I give in..'/><author><name>Romilly</name><uri>http://www.blogger.com/profile/04944907795639823332</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/-DRxR2zRTRKk/TVT5740gOoI/AAAAAAAAAHk/LXta9er-OfM/s220/rjc200288.JPG'/></author><thr:total>0</thr:total></entry></feed>
