<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-9053945</atom:id><lastBuildDate>Mon, 28 Sep 2009 15:55:35 +0000</lastBuildDate><title>Agile Application Development: Romilly Cocking's Review</title><description>Items of interest if you want to adopt, adapt, apply and improve Agile Development Processes.</description><link>http://www.cocking.co.uk/blog/</link><managingEditor>noreply@blogger.com (Romilly)</managingEditor><generator>Blogger</generator><openSearch:totalResults>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-7790623298590527822</guid><pubDate>Mon, 28 Sep 2009 10:19:00 +0000</pubDate><atom:updated>2009-09-28T11:23:49.096+01:00</atom:updated><title>Host your own Windows7 launch party?</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/09/host-your-own-windows7-launch-party.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-5808015171412922314</guid><pubDate>Sun, 05 Jul 2009 10:17:00 +0000</pubDate><atom:updated>2009-07-05T11:21:00.548+01:00</atom:updated><title>What shall we do with Gordon Brown?</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/07/what-shall-we-do-with-gordon-brown.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-1054300693843550387</guid><pubDate>Mon, 15 Jun 2009 17:05:00 +0000</pubDate><atom:updated>2009-06-15T18:15:47.866+01:00</atom:updated><title>IBM says world will drown in data next year</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/06/ibm-says-world-will-drown-in-data-next.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-7296358720723028021</guid><pubDate>Sat, 13 Jun 2009 07:03:00 +0000</pubDate><atom:updated>2009-06-13T08:08:12.356+01:00</atom:updated><title>Element 112 needs a name</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/06/element-112-needs-name.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-3225921778938015092</guid><pubDate>Fri, 06 Mar 2009 07:34:00 +0000</pubDate><atom:updated>2009-03-06T08:10:32.347Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>automated testing</category><category domain='http://www.blogger.com/atom/ns#'>testing</category><category domain='http://www.blogger.com/atom/ns#'>continuous integration</category><category domain='http://www.blogger.com/atom/ns#'>TDD</category><title>Oh, the Coder and the Tester can be Friends, can be Friends...</title><description>(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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/03/oh-coder-and-tester-can-be-friends-can.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-6043049723061059510</guid><pubDate>Sun, 01 Mar 2009 08:30:00 +0000</pubDate><atom:updated>2009-03-01T08:52:00.753Z</atom:updated><title>EtherPad - real-time collaborative text editing</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/03/etherpad-real-time-collaborative-text.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-7882741262669903510</guid><pubDate>Sat, 28 Feb 2009 11:38:00 +0000</pubDate><atom:updated>2009-03-01T09:53:27.646Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>refactoring</category><category domain='http://www.blogger.com/atom/ns#'>TDD</category><title>Refactoring is much easier...</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/02/refactoring-is-much-easier.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-6047899155927571144</guid><pubDate>Fri, 27 Feb 2009 14:07:00 +0000</pubDate><atom:updated>2009-02-27T14:34:16.466Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>GetInLine</category><category domain='http://www.blogger.com/atom/ns#'>SPA jMock</category><category domain='http://www.blogger.com/atom/ns#'>unit test</category><category domain='http://www.blogger.com/atom/ns#'>TDD</category><title>GetInLine version 2</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/02/getinline-version-2.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-4343786923205096777</guid><pubDate>Wed, 11 Feb 2009 10:41:00 +0000</pubDate><atom:updated>2009-02-11T10:56:01.007Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PCG</category><category domain='http://www.blogger.com/atom/ns#'>grumpy old men</category><title>Opportunism knocks</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/02/opportunism-knocks.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-4529131539222670740</guid><pubDate>Sat, 07 Feb 2009 14:15:00 +0000</pubDate><atom:updated>2009-02-07T14:51:34.038Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>XPday</category><category domain='http://www.blogger.com/atom/ns#'>agile devlopment</category><title>Read "Rocks into Gold" and spread the word!</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2009/02/read-rocks-into-gold-and-spread-word.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-2319459110131822979</guid><pubDate>Wed, 16 Jul 2008 08:38:00 +0000</pubDate><atom:updated>2008-07-16T10:32:22.747+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>innovation</category><category domain='http://www.blogger.com/atom/ns#'>change</category><title>How do new ideas spread?</title><description>&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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/07/how-do-new-ideas-spread.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-2541157946695291280</guid><pubDate>Wed, 16 Jul 2008 06:47:00 +0000</pubDate><atom:updated>2008-07-16T08:07:05.462+01:00</atom:updated><title>SPA2009 open for session proposals</title><description>&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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/07/spa2009-open-for-session-proposals.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-7005371383321611755</guid><pubDate>Sat, 12 Jul 2008 07:11:00 +0000</pubDate><atom:updated>2008-07-12T08:39:41.052+01:00</atom:updated><title>miniSPA2008 and cfp for Spa2009</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/07/minispa2008-and-cfp-for-spa2009.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-2015389543714232793</guid><pubDate>Mon, 28 Apr 2008 08:50:00 +0000</pubDate><atom:updated>2008-04-28T10:46:18.842+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Wiki</category><category domain='http://www.blogger.com/atom/ns#'>knowledge representation</category><category domain='http://www.blogger.com/atom/ns#'>Mind Map</category><category domain='http://www.blogger.com/atom/ns#'>Python</category><title>TiddlyWiki to MindMap converter</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/04/tiddlywiki-to-mindmap-converter.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-7586243687847896323</guid><pubDate>Fri, 25 Apr 2008 15:26:00 +0000</pubDate><atom:updated>2008-04-25T16:36:29.316+01:00</atom:updated><title>History meme</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/04/history-meme.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-278831804954790729</guid><pubDate>Tue, 15 Apr 2008 10:52:00 +0000</pubDate><atom:updated>2008-04-15T12:12:39.466+01:00</atom:updated><title>Layers considered harmful: design to interfaces</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/04/layers-considered-harmful-design-to.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-917951464603619311</guid><pubDate>Sun, 06 Apr 2008 10:30:00 +0000</pubDate><atom:updated>2008-04-15T11:51:33.964+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>automated testing</category><category domain='http://www.blogger.com/atom/ns#'>java</category><category domain='http://www.blogger.com/atom/ns#'>Hibernate</category><title>Testing Hibernate-based Persistent objects without Spring</title><description>&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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/04/testing-hibernate-based-persistent.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-8631564648478226678</guid><pubDate>Fri, 28 Mar 2008 14:19:00 +0000</pubDate><atom:updated>2008-03-28T15:10:00.503Z</atom:updated><title>Testing RIAs with WebDriver</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/03/testing-rias-with-webdriver.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-2567811978652699646</guid><pubDate>Tue, 25 Mar 2008 10:00:00 +0000</pubDate><atom:updated>2008-03-26T17:55:02.835Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>SPA</category><category domain='http://www.blogger.com/atom/ns#'>Haskell</category><category domain='http://www.blogger.com/atom/ns#'>Category Theory</category><category domain='http://www.blogger.com/atom/ns#'>FP</category><title>Category Theory/Haskell learning group in London</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/03/category-theoryhaskell-learning-group.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-7439178569397587334</guid><pubDate>Tue, 25 Mar 2008 09:56:00 +0000</pubDate><atom:updated>2008-03-26T20:35:15.849Z</atom:updated><title>Spa2008 retrospectve</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/03/spa2008-retrospectve.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-2381752177144467320</guid><pubDate>Tue, 26 Feb 2008 11:36:00 +0000</pubDate><atom:updated>2008-02-28T08:40:30.899Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>development</category><title>Fewer, better people</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2008/02/fewer-better-people.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-5997046612314521668</guid><pubDate>Tue, 16 Oct 2007 11:23:00 +0000</pubDate><atom:updated>2007-10-16T15:44:21.854+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>python jyton programming</category><title>Jython lives!</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2007/10/jython-lives.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-8208437083287327958</guid><pubDate>Mon, 24 Sep 2007 17:32:00 +0000</pubDate><atom:updated>2008-03-26T17:51:32.233Z</atom:updated><title>Download all pdfs in a web page</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2007/09/download-all-pdfs-in-web-page.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-7693640606010765853</guid><pubDate>Mon, 24 Sep 2007 14:00:00 +0000</pubDate><atom:updated>2007-09-24T15:21:09.639+01:00</atom:updated><title>Google soft-launches social bookmarking tool</title><description>&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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2007/09/google-soft-launches-social-bookmarking.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9053945.post-8176290194563641289</guid><pubDate>Sat, 22 Sep 2007 06:36:00 +0000</pubDate><atom:updated>2007-09-22T08:16:44.603+01:00</atom:updated><title>Count Blog subscriptions with this Python script</title><description>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=www.cocking.co.uk%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://www.cocking.co.uk/blog/2007/09/count-blog-subscriptions-with-this.html</link><author>noreply@blogger.com (Romilly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item></channel></rss>