« January 2005 | Main | March 2005 »

February 28, 2005

Feedback as lifeblood

I sleep easily and went to bed early on Friday night. But a TV program had me attentive and delayed my slumbers for a while. Subject? The success of EBay; now with a turnover that beats many countries of the world and growing rapidly all the time.

I'm not a great "ebayer" myself. I have done it, nice system, admire them for what they do but I've only so many hours in the day. So the following may be a "duh - of COURSE" for any of you who's a regular 'bayer ... the way their success is generated by their feedback system. Very neat, and self motivating / self justifying / self-policing.

When we launched OpenTalk here, several years ago, to allow past trainees to get back and ask questions, we questioned our own sanity. Other training outfits typically don't have a "get back to the tutor" board that's open to all comers on the internet. But OpenTalk has worked and has worked well. It does call for a certain daily dedication - I've just answered two questions this morning before posting here, and I expect there may be others during the day. But it gives trainees and potential customers a valuable way to provide feedback, and to get back and ask a question too. And these things accumulate into a useful FAQ since it's public.

The Ebay program inspired me in other areas I was working on too. Our wiki based internal note and communication system now has a public face - our share system where visitors can browse the latest gossip and (in some areas) contribute too. And a new page encourages our customers to talk about us and link to us from their own sites.

I'm proud of our product and what we do, and happy to talk about it and discuss it in public. It's a great success in our niche market, and we enjoy working most through networking with friends, colleagues and contacts.

Posted by gje at 06:11 AM

More about Graham Ellis of Well House Consultants

February 27, 2005

Course sizes - beware of marketing statistics

As a training organisation, how could we maximise our profit? By training a lot of students at the same time, by using rooms that we only hire when there's a course on, and by offering a bewildering array of special pricing options to get as many pounds from each trainee that we can. Problem is, though ... these tactics would NOT be in the best interest of the trainees.

I followed a Google ad for an outfit I'd not come across and I read:

One of the primary determinants of the success of instructor-led training classes [besides the competency of the instructor] is the accessibility students have to ask questions, get help when they need it, and receive appropriate guidance. Our open enrolment classes average less than 12 students. That means less waiting around to receive help during lab, more time spent discussing relevant problem domains, and more direct contact with the instructor. For many students it's very important to be able to discuss their specific action plan and opportunities on the job to apply what they're learning. That's just not possible if there are 20 to 30 people in a public class.
.

I agree with their sentiment - keep class sizes down - and the reasons given. We do the same. But what are they actually saying about the numbers on a typical course of theirs? If the average number is 12, then sometimes it will be higher and sometimes it will be lower. Ironically, since fewer people attend the smaller classes, the typical student will see the larger group - only the lucky minority will attend in what I consider to be a manageable group.

Here's a bit of Perl that takes some sample numbers - this might be five courses from those folks ...


# Let's run 5 training courses ...
@numbers = (5, 9, 19, 19, 7);
$report = join (", ",@numbers);
$report =~ s/(.*),/\1 and/;
print "Courses with $report trainees\n";

# What's the total number of trainees?
$sum += $_ foreach (@numbers);

# So the average course size?
print $sum/@numbers," is the average course size\n";

# But what's average number of fellow students a trainee has?
$see += $_ * $_ foreach (@numbers);
$form = "but it looks like the average is %.0f to the trainees\n";
printf ($form,$see/$sum);

So ... that means ...
earth-wind-and-fire:~/mouth grahamellis$ perl average
Courses with 5, 9, 19, 19 and 7 trainees
11.8 is the average course size
but it looks like the average is 15 to the trainees

earth-wind-and-fire:~/mouth grahamellis$
... that you're more likely than not to be one of a group of 15 ...

Also noted ... a table of competitor's prices. Except that they're only the prices of the more expensive competitors ... Also noted ... no obvious information about their training rooms and facilities. What are they not saying? ....

Posted by gje at 10:50 AM

A fortunate accident

Going through pictures of our Geek Cruise for our newsletter, I skipped over an insignificant looking photo of the Colliseum at Ephesus.

Ephesus left me wordless in awe that day - an ancient city lost to to an earthquake and the undergrowth a millenium and more; excavation and exploration started 70 or 80 years ago and it was out of this world to see. But somehow the pictures didn't do it justice. Seeing the same picture a little larger and it starts to look a little more spectacular. In this great Colliseum, which is just a tiny part of Ephesus, they've now held modern day concerts with famous names such as Elton John providing the music.

I still can't give you the impression of that place from the pictures. There's places where pictures can give you a true impression, then others where they are merely a factual record - recording what the head saw rather than what the heart felt. And I thought that Ephesus was going to be one of those.

Then, a fortunate accident. I think I clicked a button that I didn't intend to in my iPhoto package. Oops - what HAD I done? Changed my screen saver. Stonework and people pointing out from behind windows - oh sh**. But - clear the windows, and for the first time a little of the heart of the picture is showing ... 17" wide screen laptop LCD to the fore.

Do you want to see that picture full screen? It's a lotta bytes ... but here's a link to it if you would like to see. Please feel free to grab it out of your browser and use it as a screensaver too. And let us know if you recognise anyone - it's a big picture but a small world, and stranger things have happened!

Posted by gje at 06:49 AM

February 26, 2005

Beard Justification

I took a lazy fortnight's narrowboat holiday many years ago - Napton and Warwick, Kingswood and Stratford-upon-Avon, Tewkesbury and Worcester, Tardebigge and Birmingham. One of the things I didn't do during that fortnight was shave - and "the beard" grew. Graham Ellis. The family, I know, expected it to be shaved off before I returned to my training role but, frankly, I was tired of shaving daily - or if I had an important evening event then twice daily. And so the beard became something of a trademark.

In those days, I was a contract trainer teaching C programming, Shell Programming and Solaris in parallel with a number of other tutors. Contracts were awarded on a "Muggin's turn" basis - in other words to each member of the pool in turn - unless their was a particular request for a tutor who had given a previous course to be provided; the beard became something of my "trademark" - a way that past students could ask for my particular services when talking with the booking office.

The trademark still works. A trainee this week had found us online, looking for a niche course ("there aren't too many places to choose from") ... and had been sold on ours because I had taught him, and he recalled a good course, the best part of 10 years ago. How had he recognised me? "The beard".

Posted by gje at 11:37 AM

February 25, 2005

Bellringing and Programming and Objects and Perl

For the second time this year (and it's only the second month), I find that I have a keen bellringer on my programming course ... he's off each evening to meet up with fellow bellringers in church towers in Wiltshire, and having a really good time outside course hours as well as during the day. I understand that there are a substantial number of excellent sets of bells (I know that the word "set" is wrong) in this area, and I listen in some awe to the complexity described in ringing sequences - how do you get from a string like x16x36x36 to a set of results like:
1 2 3 4 5 6
2 1 4 3 6 5
2 4 1 6 3 5
4 2 6 1 5 3
2 4 6 5 1 3
4 2 5 6 3 1
2 4 5 3 6 1

With so many questions like this one - "how do I get from 'A' to 'B'" - you only need one expert to tell you how to do it, write down and test the algorithm, and then anyone who can provide inputs and read outputs can use the algorithm. In Object Oriented terms, this "hiding information within" approach is known by the term "encapsulation".

Helped by 'George' and 'Sandra', I've learn a little about ringing in the last weeks and yesterday George and I put together a sample program to ring some parts of bell changes, using Perl. Not exactly what he'll be using Perl for at work, but a parallel through which he can practise and learn further. Here's some of the code:

use bells;

push @method,new bells("Plain Bob",8);
push @method,new bells("Grandsire Triples",7);
push @method,new bells("St Clements",6);

$method[0]->setplace("x18x18"); # etc ...
$method[1]->setplace("3.1.7.1.7"); # etc ...
$method[2]->setplace("x16x36x36"); # etc ...

We've set up three methods of ringing, by name and by the number of bells involved in the changes. We've then called a method called "setplace" to define how the changes happen in place notation. Let's then ring the changes:

foreach $curr_method(@method) {

Printing out a header for each set of changes, and getting back an "action list" of what we need to apply:

@chlist = $curr_method->getchanges();
$method_name = $curr_method->getname();
print "Ringing $method_name\n";
@order =$curr_method->getcurrent();
print "@order\n";

And then actually ringing the changes are reporting the order of the bells.

foreach $chan (@chlist) {
$curr_method->change($chan);
@order =$curr_method->getcurrent();
print "@order\n";
}
}

Yes, that's all there is in my main application! The code that took us a while to work out which interprets the place notation strings and applies it to the rings of bells is all hidden within the file bells.pm which we called in at the top. The typical user doesn't need to know how it works. All they want to do is to run a program like the one above and read:

Ringing Plain Bob
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
2 4 1 6 3 8 5 7
4 2 6 1 8 3 7 5
4 6 2 8 1 7 3 5
Ringing Grandsire Triples
1 2 3 4 5 6 7
2 1 3 5 4 7 6
2 3 1 4 5 6 7
3 2 4 1 6 5 7
3 4 2 6 1 7 5
4 3 6 2 7 1 5
Ringing St Clements
1 2 3 4 5 6
2 1 4 3 6 5
2 4 1 6 3 5
4 2 6 1 5 3
2 4 6 5 1 3
4 2 5 6 3 1
2 4 5 3 6 1

I HAVE placed the bells.pm on our website if you would like a look - there's a link to it from our Object Oriented Design - Individual Object module as this complex field has proven to be such a great example of the use of encapsulation, even on a quite small project.

Posted by gje at 04:34 AM


Useful link: Perl training

February 24, 2005

Growing our systems

In systems terms, extending a system to handle two instances of something rather than one is a major step - much more major than increasing the number of instances handled even from (say) 2 to 200. The latter is just "use a bigger array" whereas with a singleton system that was never planned for growth, it's often a redesign / rewrite.

When we started training at Well House Consultants, we used a number of Singleton systems. That's no error on our part; in our initial years it would have been a huge waste of resources to use more complex and expensive systems that could handle multiple users / input but didn't have to do so. Now that we're growing, though, some of these systems need to be revisited.

Being a company that trains you on Open Source Programming languages (See all our modules described elsewhere), we feel that we should be using them to provide our co-ordination systems too. We're using a wiki (from the Hawaiian language, meaning superfast) internally to keep each other informed / updated on "todo" and "work-in-progress" lists. We've added a Demilitarized zone (DMZ) on our in house network so that staff on the road or working from home can access resources that they need. And we'll have an on line schedule / booking diary that goes rather deeper than "which courses are available when" in the near future.

Posted by gje at 08:20 AM

February 23, 2005

10 years and counting

I've now been online for 10 years - "into double figures" - (and computing for much longer). How things have changed over those ten years!

When I first got online, I was the European Technical Support Manager for a USA company known as Connectware - a part ot the AMP empire - that was looking to break into the high performance networking business using ATM technology, and also owned the RasterFlex and Vitec lines of high performance graphics board for use in Sun workstations. "The Internet" was to be this new-fangled way of communicating and my boss asked me to look into it as a better way than faxes and phone of communication with customers in some circumstances.

Based in Basingstoke, I signed the company up for an account with Demon - initially dialling in to a rack of modems in London, but improved soon thereafter when they added a POP ("point of presence") just up the road in Reading. In those early days, we spend up to half an hour at time dialling until we got through to make a connection, lines dropped frequently, and the main internet services ("killer apps" as they were known) were email and the newsgroups.

The Internet has opened up a whole new world for me - for both work and personally; great times in the past 10 years and long may they continue. Wouldn't have missed anyone or anything.

Posted by gje at 01:31 PM

February 22, 2005

YOUR application and YOUR data

I find it so much more rewarding when I'm training with a target - in other words, when I know a little bit about the use that my students are going to be making of their new skills. I think that every trainer should work as I do - tailoring his presentation to the group he has in front of him, encouraging trainees to think of how the topics covered benefit them, and even bringing along their own data and programs they're going to have to maintain to show the tutor and class.

This style of working - for the maximum benefit of the trainee in his "real world" use of the subject - does impose some restraints on the organisation providing the training. The tutors selected need to know their subject really well, and be quick to analyse requirements. A professional note-reader won't fit the bill. And commercially, the maximum class size has to be lower than the provider might like. All of our public courses are limited to seven trainees to allow our tutor plenty of time to work with each trainee on HIS application and HIS data.

Posted by gje at 08:24 AM

February 21, 2005

There is a function in PHP to do that

Once you understand the philosophy behind a programming language, you can make superb use of it. Initial learning will show you a few things and get you comfortable, but once you've also learnt a few of the things behind the language you can become a real wizard. Your educated guesses will usually be correct, and you'll be able to move on to write productive original code as you understand the nature of the beast you're using.

PHP is a language that was designed to allow embedded functionality to be provided in the form of extra tags to be interpretted server side from within an extended HTML (this is why I sometimes call it an HTML++ language). There's a huge range of these extra tags, to the extent that I have a regular saying when I'm running a PHP course that goes along the lines "there's a function to do that" ... and some of those functions are truly remarkable.

Would you like to hightlight your PHP syntax to help in debugging perhaps? There's a function to do that

highlight_file("../../trainee/h106/a3.php4"); is the only active line in a demo file I've just uploaded. The results presented show one of our training scripts in a much more readable form that the usual monochrome, and without the need to buy any extra editor addins / development tools either.

Posted by gje at 06:13 AM


Useful link: PHP training

February 20, 2005

Who are all these visitors?

I've noticed some strange visitors in our referrer logs of late .... as if 250 people per day were clicking through from a link on www.nut-zu.com. Odd, and a bit worrying. On examining the log files, it appears that there must be thousands of links on that site - with many of their pages linked to ours. And yet ... visiting the site ... it looked just like some gambling site and the HTML source gave nothing away.

Thanks to the journal of Matthew McGlynn for solving the mystery for me.

It seems that the false references are being generated in the (unfounded) hope that my site displays web referrer information somewhere ... which will act as an advert for these people. Clumsy tool, and a bandwidth waster. I'm considering whether of not it's worth bothering with Matt's filtering suggestions, or whether I should start returning a "403" (forbidden) response to that domain - we could do that easily enough from any page because of our PHP infrastructure. But at the same time, I'm just a little concerned that I might not fully appreciate why / how these people are doing this.

The domain name quoted has been altered slightly to avoid giving these people any free automated publicity. I believe that the name I've actually quoted is unregistered

Posted by gje at 06:19 PM

Lunchtime Drink

Looking through pictures of Lisa and me relaxing with trainees at the end of the day, I spotted wine and beer in the pictures. And yet just last week a customer asked me "do you ever have a drink, Graham?" because it's so rare to see me with a glass in my hand.

I used to train under contract in a larger training centre. Another contractor there used to leave his class at the training centre at lunchtime in the care of the office staff and pop across the road for a quick Whiskey (and perhaps a pint as well). And I felt that this was extraordinarily bad form. I can't question his ability to train - he always got excellent reviews at the end of the course - but somehow I couldn't condone the smell of alcohol on his breath after lunch.

The view of lunchtime drinking in the IT business seems to have toughened over the years. I can recall a drawing office team who were learning Solaris Admin to look after an Autocad system complaining loudly that their bosses had just banned the pub at lunchtime "like they have done for the drivers of our vehicles", and I felt my sympathys with the bosses rather than the work team. "Liquid lunches" as a regular routine at some companies seem to have become less common, and the liquid is now more likely to be a Coke than a bitter, now helped down by a meal rather than by a packet of crisps.

Very occasionally, we take our class to a pub at lunchtime - it tends to be on the first day of a long course where we can afford a full hour for lunch and want to make the group of separate individulas from up to 7 companys bond. We provide (buy) the food, and we'll also buy one drink per person. Only very occasionally do people choose something alcholic, and the tutor's drink is always a Coke, or pehaps an Orange Juice and Lemonade if we're really splashing out. Quite simply, I'm convinced that drinking and training don't mix.

Posted by gje at 05:28 PM

February 19, 2005

When to use Frames

Frames are an HTML feature that people seem to love or hate. They do provide an extra power to how information can be navigated on a web page by allowing partial page refreshes and partial page scrolls BUT there are a number of things on the "downside" too. Gary White will tell you all about the downside on his "rant" page.

I'm not a great fan of frames and you'll find that we don't use them on our main web site nor on most of the addition sites and client sites, but they do have their uses. Indeed - the subject has come up twice in the past two days with two different customers ... the general consensus is "best not used in most cases, but there are a few occasions".

Coding of frames is non-trivial and testing needs to be carefully and thoroughly done over a number of browsers. So I have written a PHP example where Frames ARE useful ..
* A file selector window on the left of the screen
* A feedback window on the right of the screen
* Upper and lower frames to give instructions and extra buttons

Try it out here
Read about it and see the page's source code here

Posted by gje at 04:09 PM

February 18, 2005

Some unusual features

From yesterday's mailbox:

Question: "Can you tell me what differentiates Well House Consultants from the likes of Learning Tree, QA training, Interquad etc.?"

Answer: Interqud, Learning Tree, QA and others must answer for themselves as to what they provide and don't provide, but here's a checklist of some Well House Consultants features that are unusual:

* Courses presented by an IT professional and trainer who actually writes the material.
* Public courses limited to 7 trainees so that each trainee gets maximum attention.
* Courses run even if there's just one trainee booked (though it's quite rare to have that small a course).
* Notes updated regularly / specially printed for each course.
* We specialise in niche subjects and do not provide more general training.
* Lots of practical demos written while you watch. See how programs develop.
* Purpose fitted training room for public courses with full internet access at 4 Mbit for each trainee.
* Use our laptops during the course (choice of Windows, OS X, or Linux) or your own on our network.
* 500 Open source books in our library for your use.
* Post-course support from the tutor via email or Opentalk forum.
* Bring your own data / project to discuss with the tutor.
* Training centre open from 8 a.m. to 7 p.m., and tutor available.
* List prices typically 20 to 30% lower.

And that's just a list for public courses! We're enthusiasts for the subjects we teach - and our business and style reflects this.

Posted by gje at 07:23 AM

February 17, 2005

Golden Nugget

On Tuesday evening, I was sitting in the "Golden Nugget", with my soup and salad ... and a nice piece of beef and glass of beer. Old wooden signs pointed one way to Santa Fe, the other way to Las Vegas, and in a third direction to Toiletten.

I had pulled off the German Autobahn, on spec, to find a room for the night as I got tired of driving. How is it that a roadside stop at the equivalent of a motorway service area can be such a pleasure in one country, and leave you feeling like unloved profit-fodder in another?

Posted by gje at 05:16 AM

February 16, 2005

Use of time

The sum total of my day's work was to say "yes" two times.

In order to do so, I had travelled across England - from Harpenden in the home counties (where I lived at the time) to St Austell in Cornwall the previous day, and I had stayed overnight in a hotel. After attending a meeting at which my two "yes" answers were my only contribution, I travelled home again.

So was this a worthwhile trip? Was the cost of my train ticket (I had no car in those days) and hotel justified? It turns out that, yes, it was. My role at the time was to provide UK based, English speaking technical support on a niche product, and I was joining my company's sales rep for a presales meeting with a customer just about to place a major order. My visit not only assured the customer that we had support staff in place, but also that their order was important to us and we were willing to provide that support, on site if necessary, even though they were remote from our office.

A year or two later, I took over as the sales rep for Cornwall, and got to know many of the clients nurtured by Brock (who had arranged the visit above) much better. A lovely group - and I did have an excellent product to sell - and I learnt a lot too. Even though I was just one of twelve people on the sales team, my territory was geographically huge - lots of "green fields" which, for Computer Graphics products, wasn't going to be needed on every corner. It was still a four hour drive to Cornwall. But what a pleasure to do so, and more than amply rewarded and justified too.

Why does this come to mind today? Because I'm writing this from Belgium on my way back from Munchen (Munich). I drove down all through Sunday to give a 2 day course, and I'm driving back up all through Wednesday. Those are LONG drives. For each hour of teaching, I have another 2 hours on the road. Yet it IS worthwhile. I've only to see the lights come on on "Object Orientation" with the trainees to realise that half an hour of my time clarifies what half a day or reading books for them couldn't make clear, and that's happening 8 times over with the group. Oh - and there are some 32 half hours during the 2 day course. That's a lot of justification.

Extra links ... training in Germany - details and pricing

Posted by gje at 11:00 AM

February 15, 2005

Cheap purchase - votes paid for with selfish promises

It struck me as I listened to a major political party making six pledges prior to the election that's bound to come soon ... every one of their pledges started with the word "YOUR". It was "YOUR health", "YOUR school", "YOUR job" ... and it struck me that they're appealing to the selfish worst in everyone. This is the Labour party - our "left" - and it's reminiscent of the worst that they were complaining about in the Conseervative Party in Margaret Thatcher's day - the capitalist "me" culture as they would have described it. But at least Maggie was encouraging wealth generation to stimulate the economy and bring the willing along; I've an uneasy feeling that this lot will do it by higher taxes. Tell trainees on a course to allow for a changing VAT rate in a program (always best programming practise to anticipate the need for change) and you get howls of laughter if you suggest the rate may go down, and a glum look of realism if you say it may go up.

The selfishness is sad. But where it's at the expense of people who want to join our society and work hard for everyone's betterment, it's a tragedy. The UK is a melting pot of nationallities, but there's still a fervour whipped up by talk of people who seek asylum, and people who seek a better life here. There's a fear that there won't be enough jobs to go around, that the country can't cope, and that the indiginous local population will become the minority. The tragedy is that much of that fear is founded only on the words of politicians looking for short term votes.

A vote based on gross misrepresentation and/or narrow minded bias and fear in an election carries just the same weight as a properly informed vote. A loosing canditate may say "but the people who voted for me were better informed" but as there were fewer of them, it doesn't do much good.

In the UK, we've got near-full employment. It's hard to find a good electrician or builder. It's next to impossible to find cleaners and other staff that we need to help in our business in the way we need; at best, we find someone to do a job in their timescale between other jobs to the detriment of how we run. We have yet to find a windowcleaner who can clean all of our windows and not just the bottom of the house. And yet the people are there who want the jobs ... just not able to come and take them up. The political partys seem to be playing a game of "outnastying" each other. Schemes designed to appease the voters, and in the process crushing down those faceless people who aren't here, can't speak for themselves and (the real crux of the matter) don't have a vote.

Posted by gje at 06:07 AM

February 14, 2005

Open Source becomes mainstream

Our business is small enough for us to look at any changes in the patterns of customer booking and ask ourselves whether something we've noticed is a trend ... or simply caused by the asyncronous booking events happening to come in a burst or a drought.

I think I have spotted a trend in the last 3 to 6 months. A growth in on site (private course) training requirements that's not been matched by anything like the same grown in bookings on public courses, even though we've had several of those full and people waitlisted - something we try to avoid.

Why the trend? Perhaps because Open Source is becoming more accepted and more mainstream in some larger organisations. Rather than one or two people working on some web site or research project with the languages we teach, we're seeing whole teams being trained and once the customer needs 4 or more people to learn the same thing at the same time, a private course makes economic sense.

Posted by gje at 04:19 AM

February 13, 2005

Futility of war?

An old theme that millions of words have rightly been written on.

I'm writing this, Sunday 13th February 2005 from a ferry bound from Dover to Calais; I'm then driving down to Germany. So it was poignant to be listening to the radio reports this morning of the memorial gatherings happening today in Dresden - 50 years ago, it was bombed by the British and Americans, a great firestorm ensured and perhaps 35000 to 40000 perished. Just an example of the deaths that occurred on all sides during that war, and each and every one of those deaths deserves thoughts and reflection - "was this necessary" and "how can we do things better so that there's no need to loose lives in that way in the future".

On Friday, during a lunch break, I was talking with someone who had a work colleague who was on the beach in Thailand when the Tsunami struck. (Yes, I'm ashamed I may have the spelling of that wrong).

This man was on the beach, about to take a holiday trip on a boat with his 8 year old son and 6 year old daughter when the sea dried up. The sucking of water away by the great wave which, looking, he could see in the distance. He gathered up his children and ran. He didn't know the town. But he ran as "up" as he could. To find hiself, still at a low level, up a blind alley. 8 foot wall at the top. Nowhere to go. Wave coming. And he couldn't get over.

What to do? Life or death. He somehow managed to throw his son over before the water hit ... and the wall collapsed under the strain, carrying him and his daughter through and swept them along, holding on to one another to deposit them ... in a pile of drift material ... a distance away.

Had his son being crushed by the wall that collapsed a split second after he had thrown him? Had he been swept away? He had to find out, and he ran still beach-barefooted though the detrius left by the water surge back to where the wall had been and ... nothing ... except ... a cry - a shout in his son's voice. The imagination doing wicked things? No - an act of great providence; seeing the man throw his son over the wall, an occupant of the building beyond had grabbed him and rushed up to the room of the house as protection from the wave and - the voice was real. The son was safe; indeed as was the whole family - mum - in the hotel all the while wasn't in the dramatic events. Dad stayed in hospital for a few days to repair the damage he had done running back through the flood remains. The rest of the family repatriated quickly.

I tell a story there of 4 people. I listen, I sympathise, I identify. And I see in Dresden that same group of four, but without the happy ending, perhaps 10000 times over. It's hard to visualise ten thousand, isn't it? Let me ... ten thousand crosses:

xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx That's a thousand stories. 9000 to go
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx You're only at 10000 people. 30000 to go.
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx
xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx

Posted by gje at 11:42 AM

Off to Munich

An early start this morning, for Dover. I'm training on Monday and Tuesday in Munich, taking a system for each trainee with me so driving for the 8 a.m. boat from Dover, then through to Stuttgart during the day. Gonna be a long one - thus the brief entry and the early hour.

Week in and week out I'm used to arriving on customer sites at their start-of-work time, setting up in an hour and training for the day. Monday will be no exception and it's just part-of-the-job - natural for me. Readers may find it a little unusual; thank goodness we're all different.

Posted by gje at 04:04 AM

February 12, 2005

Tcl/Tk (wish) Grid layout example

"You can acheive in 20 lines of Tcl/Tk something that would take twice that using another GUI system." That claim might be a bit aggressive, but here is a tiny Tcl/Tk example to lay out a numeric data entry pad, allow it to stretch, and also provide an example of upvar (always worth providing an example ... not an easy concept for newcomers!)


proc play val {
upvar $val current
set colours {red green yellow blue}
incr current
set current [expr $current % [llength $colours]]
return [lindex $colours $current]
}

set chess 0
label .res -text result -background [play chess]
grid .res - - -sticky news
set rowz {1 2 3 4 br 6 7 8 9 * 0 #}
set rn 0
foreach {a b c} $rowz {
incr rn
label .a$rn -text $a -background [play chess]
label .b$rn -text $b -background [play chess]
label .c$rn -text $c -background [play chess]
grid .a$rn .b$rn .c$rn -sticky news
}
grid rowconfigure . {0 1 2 3 4} -weight 1 -minsize 40
grid columnconfigure . {0 1 2} -weight 1 -minsize 40

Link - Procedures, upvar and variable scope
Link - Tk Window Manager Examples

Posted by gje at 03:00 PM


Useful link: Tcl training

Look after your staff and they'll look after you. AOL.

My Sister-in-law works for AOL at their headquarters in Virginia, near to Washington's Dulles airport. Lisa and I had an opportunity to go by on a recent visit to the area and see a most impressive series of buildings where AOL releases are put together (and I'm sure much else happens too) all clustered around a central headquarters. Nowhere in England would there be quite the same arrangement of car paking where the multistorey runs straight up to the automatic entrance doors, hallway, further doors, magnificent lifts and staircases to the work area. Some of the "Americanism" of it stems from the climate; it was between -15 and -20 degrees C when we were there, and any other parking or travel arrangmements would have been far less practical. But the rest of the layout and facilities shows a company that looks after its staff, and we saw a certain attitude of the staff looking after the company in return, and being proud of it.

Posted by gje at 10:46 AM

Joining lists in Tcl. Indirect variables in Tcl.

With all programming languages, there seem to be a few things that you end up saying "I'm SURE there's a way to do that" .... yet you can't find out how. Here are two quick solutions in Tcl - a specialist subject, I know, but one of the busiest on our forum.

# Two quick solutions in Tcl ...

# How to join a list onto the end of another list

set first {a b c}
set second {d e f}
set together [concat $first $second]
puts $together

# How to reference a variable named within another variable

set person "John Jones"
set elholder person

# Following line is how NOT to do it - Tcl expands $s just ONCE
set contains $$elholder
puts $contains
# Following line is how you SHOULD do it
set contains [set $elholder]
puts $contains

The concat command lets you concatanate lists. There's a temptation to try to join lists up using the append or lappend commands, but this always turns out to be a bit of a fiddle as you manipulate the list structure yourself, perhaps having to add in extra spaces to the syntax.

Tcl only goes through each command once as it interprets it (it's NOT recursive). That's efficient and what you want most of the time, but just occasionally - for example when you have one variable within another - it's a nuisance. Tcl's set command return the contents of a variable, though, so writing code as in the example above provide a useful is slightly inelegant solution.

We have links to more Tcl List examples and more Tcl interpretter examples available.

Posted by gje at 10:08 AM


Useful link: Tcl training

February 11, 2005

FAQ - Perl or PHP

"Do you prefer Perl or PHP?".

That's a question that would go high up my FAQ if I maintained one. But there's no easy answer; "it depends".

PHP is a fabulous language for use with web site work and embedded there. Rasmus Lerdorf and all the others involved have done a fantastic job in coming up with something that's more than just a language and provides a set of tools that let you provide amazing server side functionality. If I'm tasked with writing a web site with a server side that's more than just plain pages, I'll use PHP these days.

Perl is a quite remarkable language. You'll notice that my initial comment does not say anything about "Internet" or "Web" because Perl is much, much more than that - a general language that I'm comfortable using for complex data anaysis tasks, Systems admin, and data management in all its various forms. This does mean that when used on the Web, Perl can do an excellent job, but it's likely to be a little more complex than using PHP since with Perl you need to filter out the bits you want from all the general stuff rather than having all those bits there and close at hand as the defaults like PHP does.

And I do need to add "have you thought of Python? For a computer professional's scripting language on projects that continue to develop and need to be flexibly modified, perhaps by a team, it has a LOT going for it.

Posted by gje at 07:27 AM


Useful links: Perl training, PHP training

February 10, 2005

Examples - Gadfly, NI Number, and Tcl to C interface

Although the languages that we train on are much more stable (and unchanging) than you might think, people are always coming up with new uses and asking for further examples; many of the examples out there aren't quite right, are too complex, or aren't relevant in the UK. So I find myself writing and uploading new and modified sample programs all the time.

Want a regular expression to recognise a NIN (National Insurance Number), or an example of how to embed a new C function into Tcl? Are you looking for a piece of code that uses the Gadfly database? All these are recent requests, and all three are now up on our website along with a whole lot more.

All of the above were uploaded onto our web site yesterday evening, and we can cover them in class too; the NIN number example and Gadfly are in our "additional Python facilities" module. We cover C functions into Tcl and Vice Versa in our "Using Tcl from C" module.

Posted by gje at 06:07 PM


Useful link: Tcl training

February 09, 2005

Canteen Dragon

"You can't come in here to eat". The Canteen 'Policewoman' at the site where I'm training, to one of the students on my course. And I thought that class segregation was out of the window ...

Lunch, 12:15 to 13:00. I've been given a canteen pass for 12:20 to 12:40 and that's when I may enter. One of the trainees I was with has the same timed passed and he's fine and allowed to eat with me. The other who was forming part of the group - asked if he could (shock, horror) eat with us even though he has only a "low season" pass to eat from 13:00 to 13:20.

I recall training at a company in Cheltenham about 10 years ago where they had at least 4 different lunch areas in one of their buildings - directors (served by formally uniformed staff), managers (served by less formally dressed staff), white collar (self service, but with table cloths and staff who cleared table) and blue collar (self service, formica topped tables, clear-it-yourself). And I recall hearing about the resentment that aspects of this system caused, especially at the setting and working of the rules for "boundary cases".

Talking with my host, I described what I'd seen in the past. "Oh" he said "until recently we had a waitress section in here too, and there was (rumour has it - still is) a manager's restaurant on the 25th floor - complete with a Maitre d'hotel to show you to your table. Formal dress required ...."

Posted by gje at 04:19 AM

February 08, 2005

Fox and Python

I know I've had an early start when there's a bank of fog over the road as I drive through Beanacre and a fox dashes across just in front of me on the Chippenham bypass - so it was yesterday morning when I had a Python course to present in Manchester starting at 09:30 ... with an 08:15 arrival scheduled to allow me time to find the place, find my contact, and get all the equipment in and installed.

People are amazed how we can schedule ourselves like this - but we can, and it works "like clockwork" week in and week out. There's about half an hour of slack in my schedule in case of traffic problems, and I've been around enough to know the back roads if I have to use them. There's a spare computer or two so that in the unlikely event of a failure, I can still train ... and I could also add on an extra trainee on the day if required.

Indeed - good time was made to Manchester, with roads getting progressively busier and the inevitable queues on the M56 and through into the city. Met up with my contact, and it turns out she's from the same local town here that my ancestors / relatives were. Time for a coffee and a chinwag as I set the kit up and a chance to write tomorrow's "Horse Mouth" up to this point ((OOps I have given my game away)) as I wait for the trainees. Change for another quick coffee - I've sussed out where the machine is ...

Posted by gje at 06:17 AM


Useful link: Python training

February 07, 2005

PHP5 lets you say no

The decision to release "PHP5" rather than a "PHP4.4" was taken due to a specific change in the object model - in PHP4 the code
            $second = $first;
would clone an object (duplicate all its contents, whereas in the new model just the reference will be copied, so giving the same object a second name. This change will "break" a few applications that made use of the old (and arguably incorrect) model, and was the incompatability that forced the number change. But with the change in model number, many many other things have been added in as well as "now is a good time to do this".

Many compatible enhancements have been made to PHP4's Object oriented model, and the theme of many of them is to allow the class developer to say NO to the application programmer. From its "Personal Home Pages" origins, PHP has been a trusting language but progressively options have been added to allow for trust to be restricted. The sort of facilities that would have been ludicrous in the early days, but are necessary where a team of programmers (and sometimes a large team) is involved. Amongst the enhancements:

** The ability to label object variables and methods as Private and Protected. (You can use public too, but that's an alternative to the old var label)

** The abiity to mark something final so that it can't be overridden in a subclass.

** The ability to define a class as abstract so that the application programmer can't directly create an instance, and so that the writer of extended classes is forced to provide certain methods.

** The ability to define an interface to that a class can be forced / checked to contain certain methods at compile time.

Other enhancements in the PHP5 model (which do extend the language) include the ability to define a destructor method to be run when an object is no longer required (or at some time thereafter). The descructor method should be called __destruct. You may also name your constructor __construct now, and if you're coding only for PHP5 it's recommended that you do so to prevent the class name appearing within the class. See "Objects in PHP" for links to examples of OO in PHP - both versions 4 and 5.

Posted by gje at 03:45 AM


Useful link: PHP training

February 06, 2005

The confidence to allow public comments

Our first venture at Well House Consultants into a web site on which we encouraged public posting was our Opentalk forum where we encourage past trainees and others with questions on the subject we teach to ask. I'll admit to some anxiety at the time that we were planning to launch the service; it's a big step for a company to provide a fast and easy way for his customers to talk about whatever they like (including the company) both in public, and through the "personal messages" of such a site. I needn't have worried, though - our "open Kimono" approach as a colleague in a former job called it works well; we're proud of our product and who we are.

"The Horse's Mouth" that you're reading now also encourages comments. If you're seeing a Syndicated copy or archive copy that may not be obvious (but if you read it at source you'll find a link.

And we are - (or rather were) about to provide a book review and ranking systems for our library. But why limit it to that? Starting this morning, we're rolling our a rank and review system that will cover almost every page on our web site. You'll see that a Rank/Review button is appearing throughtout our pages as we upload updates. If you visit our course index page for example - updated this morning to add a Perl Course in June - you'll find you can submit a review.

During initial testing, our general comment system is sending everything for approval, but this will be reviewed and (I hope) quickly changed. Starting this way will allow us to catch any undocumented bugs in the system and hopefully to catch the perhaps 1-in-1000 who wants to use a system such as ours as a free board for his own advertising.

Posted by gje at 12:06 PM

February 05, 2005

Holes in on line information

"You can find anything on the web". Not quite. There are a few occasions when a search for a startlingly simple piece of informatiion still draws a blank, or a number of "not quite what I was looking for" responses.

We run a customer facility here, and we have a lady who comes in and cleans. Between times, additional wiping around and cleaning is done by the (growing) staff. Wipe cloths come from our supplier in four packets of four standard colours (red blue green and yellow) so that, it is said "each colour can be used for a different area / job". But what's the standard colour for what job?. Easy question? Not a chance ... the best I came up with on a web search was a 40 page .pdf document discussing possible standards to be set within a health trust.

I spoke with one of our customers who's in the cleaning supplies business the other day, and he confirmed what I suspected - that there really isn't any set down standard; he suggested that the most common useage would be:
--- red for toilet areas
--- blue for general areas
--- yellow for areas involving food
and that's what we're going to adopt as our standard. Anyone want some green wipe cloths??

update - May 2006 This article was written long before we started the Well House Manor project, and we've now come up with a more formal standard:

which we'll be using at Well House Manor

Posted by gje at 09:29 AM

February 04, 2005

Searching for numbers

If I'm searching for a 50kg bag of cement, and the online store only offers 48kg bags, will their search engine find this product and say "is this what you want"? Our own site searches do clever things with alphabetic searches but we're rarely had to do a "near number" hunt on our own behalf ... but we have for client sites.

Is 48 near to 50? Yes. Is 8 near to 10? Maybe, but not so near. Is 1 near to 3? No - almost certainly not. So you can't rely just on difference - indeed 93 is nearer to 100 that 1 is to 3 and the difference is much more.

Algorithm 1.

Let "$h" be the value you have and "$t" being the value you're testing. Then the nearness factor is defined as
abs( ($h + $t) / ($h - $t))
with the larger number being the closest. On this algorithm, an infinite result tells you that two values are numerically identical (so you had better extract that special case first), and higher numbers indicate better matches. Let's see some example factors:
48 and 50 - factor is 49
8 and 10 - factor is 9
1 and 3 - factor is 2
93 and 100 - factor is 27.57

Here's Perl code for searching (yes, we have Perl search training) to work this our:

#!/usr/bin/perl

if ($ARGV[0] == $ARGV[1]) {
print "Parameters are numerically identical\n";
} else {
printf ("factor is %.2f for %s and %s\n",
abs(($ARGV[0]+$ARGV[1])/($ARGV[0]-$ARGV[1])),
$ARGV[0], $ARGV[1]);
}

Algorithm 2

The algorithm above isn't always ideal. If you're searching for phone numbers, for example, it's not helpful. If you've transposed digits values, you'll want to score hits on values that are numerically very different. For this, you'll want to use someting like a Levenshtein distance algorithm. We talk further about this on our web site in the Solutions Centre

Posted by gje at 06:06 AM

February 03, 2005

0870 telephone numbers

You'll find comment elsewhere on this site about how expensive it is to telephone many numbers starting with 07 in the UK. This number sequence includes mobiles and "personal numbers", some of which will cost you up to 50p per minute. And most of us are aware that 09 numbers can be expensive.

Numbers that start with 0870 are know as non-geographic telephone numbers and they're ones you might want to be careful of too. It depends on who your phone company is, but I don't think that many of the good rates that you get to a normal geographic number extend to them. I've been given a link to a site that lists alternatives to 0870 numbers and I pass it on in case it might be useful to you.

I note a Google ad on the bottom of the page which suggests "Get paid 2ppm on calls to 0870 telephone numbers.". Does that mean that if you're left on hold when you call one of these numbers that you're paying the company that you're calling for that honour?

Posted by gje at 10:14 AM

Tips for the top

I was talking to someone the other week and he looked at me and said "working from home doesn't work - everyone needs a proper job too". I smiled. I guess that we live above the training centre, rather than working from home these days. It's inside out but really the same thing - rather like PHP is a scripting language within a web page, whereas the Perl language can be used to wrap a web page (i.e. the opposite way around).

Set me thinking - what does make us "tick" - what are the facets of how we work that leave us steadily heading where we want year upon year as other companies seem to come and go. And then someone asked how to plan and manage time. I came up with this list - a little wider ranging

1. Set yourself a long term strategy - the shorter term tactical decisions then become obvious.
2. Ensure you have the backing of your SO.
3. Draw up a list of urgent jobs and a list of important jobs, and ensure that at least some of the important ones get done.
4. Learn the 80 / 20 rule, and see where you're spending too much time.
5. Set up your work so that you enjoy it. FIND a way to enjoy the nasty bits. That will encourage you to work well and long.
6. Consider all aspects of your business from marketing right through to debt collection.
7. Allow yourself at least a few hours each week to think, read, learn and relax.
8. Do a bit of informal "critical path" analysis so that you don't suddenly find you're short on supplies on long lead.
9. Take time to service your customers - they're your ambassadors for future business. This goes further for us. We say "come as a trainee leave as a friend" and it really happens
10. Set up systems that will cope with your strategy - this allows for reuse; avoid special cases if you possibly can.
11. If you want a specialist job doing in a skill that's not yours, consider paying a specialist to do it.
12. Set up a web site that tells people everything they could possibly want to know, and tell Google about it.

12a. Consider advise carefully, encourage and learn from suggestions - but don't follow them without question.

I see similar notes on the walls of training rooms quite regularly and I make a point of applying points 7a, 7b and 7c to those note.

Posted by gje at 07:08 AM

February 02, 2005

Post course support - part of the service

At the risk of generating a lot of questions from previous trainees who read this column, I'm reproducing the following here - rewording an email answer .... I'm totally aware that a training course is just one cog in the wheel of learning and applying a new skill, and I set out some of our philosophy here ...

"""We're primarily a training company; our philosophy is very much to help people learn for themselves - what's that saying about "give a man a bag of wheat and you feed him for a month - give him seeds and you feed him for ever". We do some contract work to keep our "hands in", but we're very selective what we do as we could easily take on more that we can handle to the detriment of everyone.

Linux is a huge subject. Rather than attempt to cover every aspect of the subjects, we provide specialist training in this area on LAMP deployment - linux use, administration (as required for a web server) and installation and configuration of Apache httpd, MySQL, PHP, Perl and Python. We don't cover firewalls, DNS, sendmail and the other multitude of possible topics. Our page at http://www.wellho.net/course/linux.html introduces our Linux courses: Basics (1 day) - Admin (1 day) - Web Server (2 days) or they can be combined into a 4 days course. There's links to the full course descriptions, dates, prices, etc from the link given.

Inevitably, questions arise after a course. Customers can't know exactly what's going to turn up in their use when they get back to work and in a short course such as ours we can't cover everything. So we provide forums like "Opentalk" and an email service to customers at no charge. Since it's free, we can't make this open ended / limitless but people appreciate this and welcome the support given. We also offer "extra days" if you wanted to buy a further day of my time; we don't do an hourly rate as even a one hour contract job would "nix" a potential training day which is where are resources are geared. There's details of our post-course support at http://www.wellho.net/net/after.html

We can help further too (there's a limit to how much information I can put on a web page). If you wanted to stop around after training one day of your course for a few hours and look at your specifics, that's great; we don't throw you out at 5p.m. ;-) ... occasionally we have personal commitments in the evening, but we can usually find at least one point during a course. If you live fairly close by, you would also be welcome (by prior appointment, please!) to pop up here for a couple of hours one evening or weekend to look at specifics, and even to work on your own systems with me from here. No charge is made for these extra sessions, but if they start to get to the point where I'm recommending a complete extra day to be what you need, I'll point you at our "extra day" service http://www.wellho.net/course/ax.html"""

Posted by gje at 07:38 AM

A new skill may not be quick and easy

I'm all for encouraging people to progess their careers, to move forward from jobs that they find boring and repetitive into something that's less of a drudge and more fun to them. Indeed, at Well House Consultants we're in the business of equipping people with new skills, and long may it continue.

But I'm finding something vaguely disturbing about the current TV advert from LearnDirect featuring "Julie" who has been flippin Burgers for a job who seems to sail into a desk / computer job ("In IT" are the terms they use) in a plush office within a few seconds and all because she contacted Learndirect. Why do I find the advert disturbing?

Because I think it's building up false hopes in people. Some people, good for them, do find learning new skills easy and may walk, like Julie, out of a mobile burger van one month and into a skilled job the next. For others, there's a lot of hard graft and study involved. There's also a proportion of people who, even though they might aspire to an IT job, will find themselves as trying to turn from round to square pegs to fit into the high tech world when in reallity they are much better suited to other fields of work.

Yes, I know that an advert's limited in the message it can get across in 30 seconds and may present a biased view; I've just go a nagging feeling that the advert I'm describing here is more concerned to recruit more people to the learndirect scheme that to do what's best for each of those individuals.

Posted by gje at 06:46 AM

February 01, 2005

Allow for peak traffic on your web site

I see from this morning's paper that many people have failed to get their tax returns to the Inland Revenue by the end of January deadline, due to being unable to file through the Revenue's web site over the last few days. The paper reports that large numbers have reported "being unable to even access the website at various stages during the weekend", and a spokesman reporting that "There are no website problems". And although an unknown number who received "submission failed" messages have been given a further 2 weeks, anyone who couldn't even get into the system now faces a 100 pound fine for being late.

When you design a web site and consider you're traffic levels, it's important to consider peak loadings as well as the average number of hits per day. This is something that we always look for in our contract work, and we always advise on our courses. Almost without exception, web sites have quiet and busy periods and sometimes the peak is extraordinary.

* A client's time card entry system that we provided receives about 20 times the number of hits on the first and last days of the month as it does on a typical mid-month day.

* TV show web sites get extraordinary peaks when the show is on or just over, as do betting sites on the day of the Grand national, the FA cup final, the Derby or the Gold Cup

* An online ordering site that we've provided takes twice as many orders on a mid week day than a Monday or a Friday - people want to order and have supplies delivered in time for the weekend.

* On our busiest day in the last 4 weeks, our site got 52000 hits and on the quietest day just 11600. Looking back over the last completed 24 hours (a quiet Sunday), hourly hit rate varied from 443 hits up to 1108

Peak loading is something that should be considered on a case by case basis, with the benefit of having someone who knows the organisationand its history to hand to advise. We would tend to assist in this area on extra days, but the subject also arises on regular courses such as MySQL and LAMP deployment

I don't know what happened at "The Revenue" over the last few days - newspapers are not an ideal source of techincal information, so I can only guess. But on the surface it does look as if the system wasn't broad enough to handle the 5000 reported requests per hour yesterday - quite amazing when you hear of Slashdot servers that handle 500 requests per second.

Posted by gje at 08:18 AM