<< January 2008 March 2008 >>

Friday 29 February, 2008
#[linkfarm] Groups Near You - We don't talk enough... Groups Near You helps people in your neighbourhood get to know each other
More useful loveliness from the MySociety people

[Add a comment]
Sunday 24 February, 2008
#[linkfarm] Musical SpongeBob Digital Thermometer - Oral, underarm or rectal use
[Add a comment]
Saturday 23 February, 2008
#[linkfarm] foi.mysociety.org - Request and explore UK Government information
mySociety's new site - see what Freedom of Information requests people are making of central Government, and helps you make your own.

[Add a comment]
#First ice cream van of the year

... is plinky-plonking what might be a tune outside. It's not a good looking van and I can't say I blame the punters for not flocking to it. The time, which I'm recording for posterity, is 15:52.

Previous years:

smellygit said Maybe there is an ice cream van union who dictate when they start, cos I heard my first one today too.... [added 23rd Feb 2008]
Pete [w] said Ooh, I saw one a few days ago but register the oddness. Was probably this week. Quite a nice looking van if I remember rightly. [added 23rd Feb 2008]
Pete [w] said didn't register... [added 23rd Feb 2008]

[Add a comment]
Friday 22 February, 2008
#Cooking with Pete: Pasta and Cavalo Nero

Cavalo nero is beautiful dark loose cabbage with a lovely slightly sweet flavour. It's very easy to grow, and despite what the link above says, ours overwintered and we're cropping it now. Because it is that bit sweet, it works rather well against the sourness of lemons.

To make tea for two, lightish lunch for four, run to your pantry and gather

Pop on your pinny, and get cracking!

  1. Boil up plenty of water for the pasta. Use a good large pan.
  2. While that's going on, strip the cavalo nero from its stalks.
  3. Find a pan large enough to take everything, and stick it on the heat. Throw the pinenuts in, dry, and stir them round gently until they're nicely brown. Be careful - one minute they'll be pale then before you know it they'll go over. Keep an eye on them and once they're nice and brown, tip them out into a bowl.
  4. Stick a bit of oil in the pan. Fling in the onion, and sweat it down. Zest the lemon and add that too.
  5. Get the pasta into the boiling water.
  6. When the pasta is one or two minutes from ready, throw the cavalo nero leaves in with the pasta. Give it a stir. The pan should come back to the boil pretty quickly. When it does check your pasta.
  7. Drain the pasta and cavalo nero. Shake it. Shake it some more - they'll be a lot of water trapped in the leaves so make sure you get it all out.
  8. Add the pasta and leaves to the onion. Add the cream, but not too much because you don't want it swimming. Squeeze your naked lemon, and pour the juice in too. Give it all a jolly good stir. Tip the pinenuts over the top. Give it another stir.
  9. Throw your parsley, if you like it, over the top
  10. You're done! You may now eat your tea.

anonymous said I like the look of this. I'm a bit at a loss as what to do with all this cavalo nero I've grown ( 10 plants). Looks lovely as a plant but it's as tough as old boots. I say braise it for at least 25 mins with fried onions and bacon. Then it is edible. It's much tougher than cabbage and demands rough treatment. [added 26th Sep 2009]
anonymous said Cavalo Nero veg curry with red peppers, onion and chick peas and tomatoes. Cook in a balti sauce in a slow cooker for 1-2 hrs add chunks of fresh tomato just before the end of cooking.

serve with boiled rice. [added 13th Oct 2009]


[Add a comment]
#[linkfarm] Local councillor's car lands star role in pop video - "You don't see many of them around any more, so I'm proud to own part of the motoring heritage of the city, " he says.
It's not just a car, it's a political statement.

   * Ken [e] [w] said It's a pity, then, that all MG roadsters to the last one in 1980 were made in Abingdon, Oxfordshire. MG was an Oxford-based company, latterly part of the nationalised BL group. The only MGs punted out of Longbridge being badge-engineered variants of other cars, and then the much much later MG-F. It's hard to see how his car can be part of Brum's motoring heritage. [added 22nd Feb 2008]

I never said it was a meaningful political statement :) [added 22nd Feb 2008]

   * Ken [e] [w] said ...and I wasn't really commented on your comment, it's just there wasn't a 'Leave Comment' option on the original piece. Maybe I should write to my local MP, or better still, "Dear Barrie Took..." ;)) [added 22nd Feb 2008]

   * Ken [e] said Barrie? Barrie!? Barry! F**k me, I'm out of it. [added 22nd Feb 2008]

You are - he died five years ago. [added 22nd Feb 2008]

[Add a comment]

Thursday 21 February, 2008
#[linkfarm] Warner Bros. will turn anime artist Katsuhiro Otomo's six-volume graphic novel "Akira" into two live-action feature films, the first of which is being fast tracked for release in summer 2009. - Each feature will be based on three of the books in Otomo's series. The story takes place in New Manhattan, a metropolis that was rebuilt after being destroyed 31 years earlier. Otomo will exec produce the films.
New Manhatten? Tetsuo-o-o-o-o-o-o-o-o-o-o!

[Add a comment]
Wednesday 20 February, 2008
# Distances from London are actually measured from Charing Cross, indeed from Nelson's Column. Where are distances from Birmingham measured from?
bounder said Wikipedia says Victoria Sq do let us know if you find out the truth. [added 26th Feb 2008]

[Add a comment]
Tuesday 19 February, 2008
#[linkfarm] EeeUser Wiki
[Add a comment]
#[linkfarm] Asus EEE PC UK Stock checker - Desperately looking for an Asus EEEPC - but can't find one in stock? Look no further - this page checks stock at all the main UK retailers and reports back whether they currently have availability.

   * smellygit said I fondled one in the Reading PC World yesterday. It was quite small and light. It was also very hot. And it seemed quite slow too. [added 19th Feb 2008]

I've not used it enough to really have a proper opinion yet, but it seems perfectly fine. Plays a decent game of Tux Racer too :) [added 20th Feb 2008]

   * smellygit said Are we going to get a full review? [added 21st Feb 2008]

Once I had a chance to have a proper fiddle - it's Natalie's not mine. [added 21st Feb 2008]

   * smellygit said Aren't they cheap enough to have one each ;) [added 22nd Feb 2008]

Absolutely - I'm waiting for the 4Gs to come back in stock. [added 22nd Feb 2008]

[Add a comment]

#[linkfarm] Hutch Owen Daily - Do? Since when does a brand have to do anything? The brand embodies!! The brand embraces and surrounds! The only real question is how does it make you feel??
[Add a comment]
#[linkfarm] Participants in military cyber-war exercise attacked the system running the game - In the middle of the war game, someone quietly attacked the very computers used to conduct the exercise. Perplexed organizers traced the incident to overzealous players and sent everyone an urgent e-mail marked "IMPORTANT!" reminding them not to probe or attack the game computers.
Put up your hand if you didn't immediately think Kobayashi Maru ...

   * Ken [e] [w] said Would the real James Tiberius Kirk please stand up! [added 19th Feb 2008]

[Add a comment]
#[linkfarm] Peruvian Anti-Riot Police Uniforms Look Like Judge Dredd Meets Batman - This makes Peru the latest entry in a long list of countries I will try to avoid rioting in.
[Add a comment]
Monday 18 February, 2008
#[linkfarm] Forth Bridge painters to down brushes in 2012 - Network Rail is set to end the century of endless slog by stumping 74m for a three-coat paint job similar to that used on oil rigs and which will last for up to 40 years.
Boo! Hiss! Another fine British tradition succumbs to "progress" ...

[Add a comment]
Friday 15 February, 2008
#[linkfarm] Early Mars - The Red Planet was too salty to sustain life for much of its history, according to the latest evidence gathered by rovers on the Martian surface.
Spirit and Opportunity, now on day 1464 of their 90 day mission.

[Add a comment]
#[linkfarm] A chat with Mike Johnston - Mike in Mono talks about his music, animations, electronica, Plone and their Peel sessions, Being Clive 2 in the ZX Spectrum Orchestra, being a civil servant, his animation being shown at the National Film Theatre...
From 2005 .

[Add a comment]
#[linkfarm] All things to all men - Hardcore punk, wrestling scriptwriter, house DJ: Bob Mould has had many lives. He tells Keith Cameron about his new 'state of equilibrium'
[Add a comment]
#I've adopted a Beanworld orphan
A Larry Marder colour sketch of a Bean
Richard [e] [w] said you is lucky lucky bean owner jez. [added 15th Feb 2008]

[Add a comment]
#[linkfarm] The 40th Anniversary of Jethro Tull is upon us in February 2008 - Having initially thought that it was all best avoided in any reference to our upcoming concert tours, I slowly changed my mind after chatting to the others in the band and to some of the fans. Now I have agreed that we will celebrate the tours with a full laser light show, a dancing troupe of honed and bronzed young men fresh from the Madonna boudoir, 60 foot inflatable flute-phallus on stage, Chinese acrobats and fireworks nightly and live prostate examinations for lucky competition-winners during the concert intermission.
Appears to pass the Midlands by. I may have to travel.

[Add a comment]
#[linkfarm] Primality regex
A regular expression matching prime numbers

[Add a comment]
#[linkfarm] Atheist Sees Image of Big Bang in Piece of Toast - "I was just about to spread the butter when I noticed a fairly typical small hole in the bread surrounded by a burnt black ring. however the direction and splatter patterns of the crumbs as well as the changing shades emanating outwards from this black hole were very clearly similar to the chaotic-dynamic non-linear patterns that one would expect following the big bang". "It's the beginning of the world" he added excitedly.

   * Ken [e] [w] said I especially like "I have always been an Atheist and to see my life choices validated on a piece of toast is truly astounding". [added 15th Feb 2008]

[Add a comment]
Wednesday 13 February, 2008
#[linkfarm] The least interesting number - Berry's paradox goes like this: Some natural numbers, like 2, are interesting. Some natural numbers, like 255610679 (I think), are not interesting. Consider the set of uninteresting natural numbers. If this set were nonempty, it would contain a smallest element s. But then s, would have the interesting property of being the smallest uninteresting number. This is a contradiction. So the set of uninteresting natural numbers must be empty.

   * Martin Tang said This is the least interesting theorem in Number Theory. [added 11th Nov 2008]

[Add a comment]
#[linkfarm] Jim Sweeney in My MS and Me
My vision became blurred in 1985
I was diagnosed with multiple sclerosis in 1990
The walking stick appeared in 2000
I decided to make some money out of it all in 2004

Part one and two, also Bye Bye Edinburgh

[Add a comment]
#[linkfarm] EEE PC Internal Mods Guide
Still waiting for mine ... :(

[Add a comment]
Tuesday 12 February, 2008
#[linkfarm] The end of cheap food - FOR as long as most people can remember, food has been getting cheaper and farming has been in decline. In 1974-2005 food prices on world markets fell by three-quarters in real terms. Food today is so cheap that the West is battling gluttony even as it scrapes piles of half-eaten leftovers into the bin.

   * Prof Scrub [e] [w] said Dear Cheap Diner,

Let me tell you it is not at all cheap eating! At our local country club, the terrine, parfait et foie doi frits sur leur jus de costs a fortune.

Prof Scrub

http://www.profscrub.com [added 12th Feb 2008]


[Add a comment]
Sunday 10 February, 2008
#[linkfarm] Spot the Bug - Identify the elementary programming error in the following actual output from a real web store.
[Add a comment]
#[linkfarm] Lake Wobegon effect - The Lake Wobegon effect is the human tendency to overestimate one's achievements and capabilities in relation to others. It is named for the fictional town of Lake Wobegon from the radio series A Prairie Home Companion, where, according to the presenter, Garrison Keillor, "all the women are strong, all the men are good-looking, and all the children are above average." In a similar way, a large majority of people claim to be above average; this phenomenon has been observed among drivers, CEOs, stock market analysts, college students, police officers and state education officials, among others. Experiments and surveys have repeatedly shown that most people believe that they possess attributes that are better or more desirable than average.
[Add a comment]
#[linkfarm] Dunning-Kruger effect - The Dunning-Kruger effect is the phenomenon wherein people who have little knowledge think that they know more than others who have much more knowledge. Dunning and Kruger were awarded the 2000 Ig Nobel prize for their work.
[Add a comment]
Saturday 09 February, 2008
#A filtering iterator in C++

Back in December I shipped myself over to Cambridge to do a technical presentation on the wonders of iteration. It went pretty well although I still think I'm not quite getting my real point over, possibly because I haven't fully worked out what my real point is. I know it's in there, I need to surface it better.

The code I present is in Java and Python, primarily for my convenience. I'd written the original talk using Java, and the examples I'd lifted were in Python. Further, most people can read Java and Python even if they don't use either of them, and you can generally fit a reasonably complete example on a single slide without an excess of punctation or other distractions. Consequently they're good from a pedagogic standpoint. The audience that evening was largely composed of guys who worked in C++, and I asserted throughout that the ideas I was presenting could be implemented in C++ without any particular difficulty. I was picked up on that by someone (who's name I unfortunately didn't catch) at the end, who argued that the typing would get in the way. Specifically, he thought that a C++ version of this Java iterator would be awkward.

public class FilterIterator implements Iterator
{
  public FilterIterator(Iterator iterator, Predicate predicate)
  {
    iter_ = iterator;
    pred_ = predicate;
    findNext();
  }

  public boolean hasNext()
  {
    return next_ != null;
  }

  public Object next()
  {
    Object current = next_;
    findNext();
    return current;
  }

  public void findNext()
  {
    next_ = null;
    while(iter_.hasNext() && next_ == null)
    {
      Object candidate = iter_.next();
      if(pred_.test(candidate))
        next_ = candidate;
    }
  }

  ...
}

Writing new iterators in Java is very easy, because all you have to do it fulfil the java.util.Iterator interface. With that done, you can throw your new iterator around and it'll drop right in thanks to that common interface. Iterators in C++ can be more awkward, it's true. There is no common base class, and iterators are typically tied to the type of whatever they iterate over. A std::vector<string>'s iterators are of type std::vector<string>::iterator, a std::deque<string>'s iterators are std::deque<string>::iterator, and the two are not interchangable, at runtime at least, despite both having essentially identical characteristics. Generally this isn't a problem but for the situations I describe in the presentation, using iterators to abstract data sources or to build a view of something, it appears to present something of an obstacle.

I continued to assert that the obstacle was, in fact, illusory, and that a little bit of scaffolding would take you a long way. He disagreed. There was a bit of back and forth around the room (including a suggestion that this was the Sapir-Whorf hypothesis in action), but I didn't win him over and short of starting to write code on the whiteboard it didn't look like I was going to. So we all went to the pub.

In the following few days I did write the code, and I think I would have brought him round in the end.

A naive C++ filtering iterator

template<typename iterator_type, typename predicate_type>
class filter_iterator
{
public:
  typedef typename iterator_type::value_type value_type;

  filter_iterator(const iterator_type& begin, const iterator_type& end, const predicate_type& pred):
    current_(begin), end_(end), pred_(pred)
  {
    while((current_ != end_) && (!pred_(*current_)))
      ++current_;
  } // filter_iterator

  value_type& operator*() const { return *current_; }
  value_type& operator->() const { return *current_; }

  filter_iterator& operator++() { advance(); return *this; }

  bool operator==(const filter_iterator& rhs) const { return current_ == rhs.current_; }
  bool operator!=(const filter_iterator& rhs) const { return !(operator==(rhs)); }

private:
  void advance()
  {
    do
    {
      ++current_;
    }
    while((current_ != end_) && (!pred_(*current_)));
  } // advance

  iterator_type current_;
  iterator_type end_;
  predicate_type pred_;
};

There are some obvious differences from the Java version, primarily due to differences in language idiom. Java iterators know the range they traverse, while C++ uses a pair of iterators to denote a range.

This iterator does indeed filter, and its use is straightforward :

class Even
{
public:
  bool operator()(int& i) { return i%2 == 0; }
};

...

std::vector<int> vec;

... populate the vector ...

filter_iterator<std::vector<int>::iterator, Even> fb(vec.begin(), vec.end(), Even());
filter_iterator<std::vector<int>::iterator, Even> fe(vec.end(), vec.end(), Even());

for( ; fb != fe; ++fb)
{
  std::cout << *fb << std::endl;

  ... do something else with *fb ...
} // for ...

Job done, right?

Well, no. It works, but the usage is cumbersome at best. The type of the instantiated filter_iterator is related not only both to the type of iterator it wraps, and also the type of the predicate. Not only is filter_iterator<std::vector<int>::iterator, Even> not substitutable for a std::vector<int>::iterator, it's not even a substitute for filter_iterator<std::vector<int>::iterator, Odd>. It's not exactly adding flexibility, is it?.

But what to do?

Simplification through type erasure

Huge chunks of the C++ Standard Library are built around generic programming techniques, most notably the containers, iterators, and algorithms of the STL. The approaches I describe in the talk are, quite plainly, object-oriented techniques. The proliferation of types in the code above arise from the tension between the generic and object-oriented programming.

Type erasure gives us a way to relieve that tension. In our filter_iterator, we don't actually care about the actual type of iterator being wrapped. It isn't exposed through the public interface, and so our client code doesn't care about it either. In the public interface, we only care that it returns an int (or whatever) when dereferenced. Internally, the implementation only requires that wrapped iterator can be advanced by calling operator++ and compared for equality. If only there was a common base class along the lines of

class iterator_base
{
  virtual int& get(); // aka operator*()
  virtual void advance(); // aka operator++()
  virtual bool equal(const iterator_base& rhs); // aka operator==()
}

If you squint a bit, looks almost like the java.util.Iterator, doesn't it? Perhaps Josh Bloch was on to something after all. Anyway ... We can effectively introduce such a base class through the use of an adaptor or wrapper. If we using a template class with a non-template base class, we create a type specific wrapper to swaddle around the iterator, which we can then manipulate through the base class. Because the base class isn't parameterised, it doesn't expose anything about the wrapped iterator. By the classical computer science technique of an extra layer of indirection, we've slipped in a common base class down the side of our existing iterators.

template<typename value_type>
class iterator_holder
{
public:
  template<typename iterator_type>
  iterator_holder(const iterator_type& iter) :
      iter_(new holder<iterator_type>(iter)) { }

  ~iterator_holder() { delete iter_; }

  ...

  value_type& get() const { return iter_->get(); }

  void advance() { return iter_->advance(); }

private:
  class holder_base
  {
  public:
    virtual ~holder_base() { }

    virtual holder_base* clone() const = 0;

    bool compare(holder_base* rhs)
    {
      return (type() == rhs->type()) && (up_compare(rhs));
    } // compare

    virtual const std::type_info& type() const = 0;
    virtual void advance() = 0;
    virtual value_type& get() const = 0;

  protected:
    virtual bool up_compare(holder_base* rhs) const = 0;
  }; // class holder_base

  template<typename iterator_type>
  class holder : public holder_base
  {
  public:
    holder(const iterator_type& iter) : iter_(iter) { }

    virtual holder_base* clone() const { return new holder(iter_); }

    virtual const std::type_info& type() const
    {
      return typeid(iter_);
    } // type

    virtual void advance() { ++iter_; }
    virtual value_type& get() const { return *iter_; }

  protected:
    virtual bool up_compare(holder_base* rhs) const
    {
      holder* r = dynamic_cast<holder*>(rhs);
      return iter_ == r->iter_;
    } // up_compare

  private:
    iterator_type iter_;
  }; // class holder

  holder_base* iter_;
}; // class iterator_holder

That's enough code, and I won't dwell on the details. The main thing to note that outmost class iterator_holder is parameterised on the value type, on what the held iterator points to, rather than the type of the iterator itself. The holder and holder_base are the template class with non-template base described above.

We can rewrite filter_iterator to use iterator_holder, and our example becomes

filter_iterator<int, Even> fb(vec.begin(), vec.end(), Even());
filter_iterator<int, Even> fe(vec.end(), vec.end(), Even());

for( ; fb != fe; ++fb)
{
  std::cout << *fb << std::endl;

  ... do something else with *fb ...
} // for ...

But look at this. We can also write this

std::deque<int> deq;
...

filter_iterator<int, Even> fb(deq.begin(), deq.end(), Even());
filter_iterator<int, Even> fe(deq.end(), deq.end(), Even());

for( ; fb != fe; ++fb)
{
  std::cout << *fb << std::endl;

  ... do something else with *fb ...
} // for ...

Exchanging the vector for a deque doesn't require any other change. That's rather a useful result.

One down, one to go

We can perform a similar exercise with the predicate type. So long as it has some function that takes a value_type and returns bool we really don't care about the precise wheres and why fors. Writing a similar predicate_holder, the filter_iterator reduces to

template<typename value_type>
class filter_iterator
{
public:
  template<typename iterator_type, typename predicate_type>
  filter_iterator(const iterator_type& begin,
                  const iterator_type& end,
                  const predicate_type& pred):
    current_(begin), end_(end), pred_(pred)
  {
    while((current_ != end_) && (!pred_.test(current_.get())))
      current_.advance();
  } // filter_iterator

  filter_iterator(const filter_iterator& rhs) :
    current_(rhs.current_), end_(rhs.end_), pred_(rhs.pred_) { }

  filter_iterator& operator=(const filter_iterator& rhs)
  {
    current_ = rhs.current_;
    end_ = rhs.end_;
    pred_ = rhs.pred_;
    return *this;
  } // operator=

  bool operator==(const filter_iterator& rhs) const { return current_ == rhs.current_; }
  bool operator!=(const filter_iterator& rhs) const { return !(operator==(rhs)); }

  value_type& operator*() const { return current_.get(); }
  value_type& operator->() const { return current_.get(); }

  filter_iterator& operator++() { advance(); return *this; }
  filter_iterator operator++(int)
  {
    filter_iterator c(*this);
    advance();
    return c;
  } // operator++

private:
  void advance()
  {
    do
    {
      current_.advance();
    }
    while((current_ != end_) && (!pred_.test(current_.get())));
  } // advance

  iterator_holder<value_type> current_;
  iterator_holder<value_type> end_;
  predicate_holder<value_type> pred_;
}; // class filter_iterator

It doesn't look hugely different from the first version, but the type signature is much more straightforward. Not only is it much easier to work with, it's significantly more flexible.

filter_iterator<int> fb(vec.begin(), vec.end(), Even());
filter_iterator<int> fe(vec.end(), vec.end(), Even());

for( ; fb != fe; ++fb)
{
  ... do something with *fb ...
} // for ...

// and now the odds
fb = filter_iterator<int>(vec.begin(), vec.end(), Odd());
fe = filter_iterator<int>(vec.end(), vec.end(), Odd());

for( ; fb != fe; ++fb)
{
  ... do something with *fb ...
} // for ...

Victory is mine, I gloated to myself before realising I'd rather exceeded my brief. The iterator_holder class, far from being an implementation detail for the filter_iterator, is a useful piece of kit in its own right, providing a runtime polymorphic type-safe wrapper for arbitrary iterators. It's the thing I should have been aiming for in the first place. Everything else - filtering iterators, transformers, or whatever - could be built on and with it. Ah well - maybe next time.

Further reading

External Polymorphism - An Object Structural Pattern for Transparently Extending C++ Concrete Data Types. What we've just done has a name.

Googling around I found A Fistful Of Idioms - Giving STL Iterators a Base Class, an article from 2000 in which my chum Steve Love develops an any_iterator wrapper class. I must have read it at the time, but can't explicitly recall doing so. Towards the end of last year, Thomas Becker published On the Tension Between Object-Oriented and Generic Programming in C++ and What Type Erasure Can Do About It in which he developed any_iterator, a type-safe, heterogeneous C++ iterator. The Adobe Source Libraries also have an any_iterator. All of those are rather better developed that what we stumbled over writing filter_iterator. Perhaps I should pre-emptively google next time?

Boost.Iterator includes a filter_iterator. It also includes several other useful iterator adaptors, including a transform_iterator and a zip_iterator. Matthew Wilson describes a bidirectional filter_iterator in an extract from his Extended STL book. Here's another. All are essentially equivalent to the naive version presented above, if rather more complete and, in the Boost case, rather more formally specified.

On a slightly different track, Mr Edd has an opaque_iterator, designed to reduce compile-time dependencies. I do like the look of that - it's jolly clever.

Kevlin Henney's article in the August 2000 C++ Report, Valued Conversion, covers the same techniques describing a class which can hold any value. That code grew up to become Boost.Any.

Victor Bogado da Silva Lins [e] said Notice that once you use a virtual call to operate on an iterator you loose the main advantage of generic programming, since the compiler won't be able to optimize for any particular type of iterator. This may be fine with java, since it has a JIT, but in C++ a use of an "any_iterator" in a inner loop would probably cost a lot in terms of performance. [added 1st Jun 2010]

[Add a comment]
#[linkfarm] Jungle Disk - Reliable online storage powered by Amazon S3
[Add a comment]
Friday 08 February, 2008
#[Arabica]Taggle: Parameterised on string_type

The Taggle parser in subversion is now parameterised on string_type and string_adaptor, in exactly the same way as the usual Arabica XMLReader class. The two are now equivalent, which means that all the SAX filters, the DOM builder, XPath, and so on can be applied to Taggle.


[Add a comment]
#[linkfarm] rsync.net - Business continuity and disaster recovery built on open standards and common sense.
[Add a comment]
Thursday 07 February, 2008
#[linkfarm] Rsync for Windows - If you are a Linux SysAdmin looking for a way to Rsync a Windows machine to your Linux server, or you are a Windows user who wants to use Rsync as a Server, then you have come to the right place
[Add a comment]
#[linkfarm] rsnapshot - a remote filesystem snapshot utility, based on rsync
[Add a comment]
#[linkfarm] Time Machine for every Unix out there - Using rsync to mimic the behavior of Apple's Time Machine
[Add a comment]
Wednesday 06 February, 2008
#[linkfarm] Pro-Wrestling NOAH, Skydome, Coventry, June 21 - Kobashi : Misawa : Kenta : Danielson : Marufuji : McGuinness
Should be top.

[Add a comment]
#[linkfarm] The Fifth Edition of XML 1.0 is now a Proposed Edited Recommendation
[Add a comment]
#[linkfarm] Daily Telegraph: Acid House smiley face found on Mars
As discovered by the Viking mission in 1976. Daily Telegraph - Only 30 years late with the news.

[Add a comment]
#[linkfarm] Gloom: The Game of Inauspicious Incidents and Grave Consequences - Tabletop Tuesdays: Schadenfreude in a Card Game
[Add a comment]
#[linkfarm] M&S flogs lingerie model with 'durable hardwood feet' - Frame exceeds the British Standards set for heavy domestic use

   * Ken [e] [w] said She'd sit perfectly in my 'contemporary living room' - though I'm not sure that Tracey would agree. [added 6th Feb 2008]

[Add a comment]
Tuesday 05 February, 2008
#

So we go
Up up - do the jump
Move around and clap your hands together
Down down - turn around
Having fun is what it's all about

Hal-baby and I took in a show at the Alex on Sunday afternoon. He loved it. I loved it. It was top fun!

Gevs said We went on Sunday too (11am performance) for James Birthday, it was ace fun, much better than CBeebies live. Robbie Rotten stole the show! [added 5th Feb 2008]
Ken [e] said That's what I call energy!

(Does it feature the same 'North Atlantic' cast?)

((Er, Jez - is that a graphic I see before me?)) [added 5th Feb 2008]

Gevs said Sporticus looked knackered half way through our show, so christ knows how me managed a second one! [added 5th Feb 2008]
It was a British looky-likey cast, but they were all pretty good. Sporticus had the tash, the accent down pat, and the requisite biceps. He'd obviously filled up on sports candy for lunch, because he looked fine to me. Stephanie channelled Bonnie Langford a touch, but that is more-or-less what the part needs. Four year old don't know who Bonnie Langford is anyway. [added 5th Feb 2008]

[Add a comment]
Friday 01 February, 2008
#

Gah. I've been putting this off, and off, and off, but I suppose I'd best get on and get it out the way, then I can stop fretting, RussL can stop wondering if I've ignored him, and we can all resume our lives with renewed vigour and pep.

So it goes like this, so read that now if you haven't already. M'chum RussL has tagged me, and I wasn't safe, or exes, or whatever today's young people call it these days. Here we go:

Odd, but fun, fact about Birmingham

God, this is difficult. I'd attempt to make up an initially plausable lie that spiralled into madness, but chum Tom does that kind of thing much better than me. And, indeed, already has. I could go for that old chestnut about Birmingham having more miles of canal than Venice, but then Birmingham is very, very large and Venice is very tiny in comparison. It'd fit comfortably inside the Middleway with plenty of room left over. Actually, it's less of a difference than you think - Birmingham has 58km of canal, while Venice has 42km. Given a population about around a million against Venice's 62,000, that actually means that Birmigham is vastly under-canaled. It has a trifling 5.8cm of canal per head of population against Venice's magisterial 67¾cm. For Birmingham to match that we'd have to build another 620km of canal. I'm guessing now, but that would probably mean digging out all the main roads into the city and flooding them. And that would be silly, wouldn't it?.

Odd, but fun, fact about this website

As if this wasn't hard enough already. Back in 2001, I got a phone call from a woman at Thames television wondering if I would go on some late night entertainment (i.e. an early let's-laugh-at-the-internet-weirdos) programme. She was quite disappointed when I explained that a) I didn't live in London and b) all that stuff about playing Top Trumps with the cards prostitutes leave in phone boxes wasn't meant to be taken seriously.

Tag your post "birminghamUK" and "brumblogtig"

That was easier.

Choose Two People to Tag

And will they still love me in morning? Ok, I'm choosing The Baron even though I suspect he's officially in Smethwick. Nevermind, I haven't seen him for a while and hopefully he'll have forgotton about this by the next time I do. I'm also choosing international man of musicalness Dubber. I don't believe we've met, but I realised recently that I know his wife. No, not know his wife. Know his wife. Sort yourself out. Really.

Can I go now, sir?


As an aside, and observant readers will probably have realised, I really don't like the word blog, but I can't explain why. I'm also uncomfortable with Brum and rarely use it, because I'm not from round these parts and it doesn't seem right for me to.

Russ L said Blimey Jez, you didn't have to play if you didn't want to. [added 2nd Feb 2008]
Yea, but nobody likes a spoil sport :) [added 2nd Feb 2008]
Bobbie [e] said I am Wife of Dubber. I know a number of men named Jez. Which one are you? [added 2nd Feb 2008]
The one with the dog and two nippers, one with curly red hair, generally bought coffee, quinoa, and tofu. Is that sufficiently distinguishing? [added 2nd Feb 2008]
Marv [e] said Very good effort there, Jez. I'm so glad no-one tagged me with this! [added 2nd Feb 2008]
Bobbie [e] said Aha, yes! Don't forget the sneaky cake:) [added 3rd Feb 2008]
I thought that was just between the two of us. [added 3rd Feb 2008]

[Add a comment]
#[linkfarm] Real Programmers... Use Emacs
[Add a comment]
<< January 2008 March 2008 >>