Archive

Archive for November, 2004

The Registrar of Companies

November 24th, 2004 1 comment

Every company in the UK has to file two documents annually with the Registrar of Companies – their accounts, and a “shuttle return” listing the company’s address, directors, shareholders etc. The dates by which these must be filed are different for each company, but determined by law.

And of course, just like anything that’s determined by law, there has been much argument over what that law actually means.

I discovered a wonderful case recently in the Company Law Reports: Registrar of Companies v Radio-Tech Engineering. The rule for accounts is that they must be filed within 10 months of the financial year end. This company’s year end fell at the end of September, and so they filed their accounts at the end the following July, on what they believed to be the latest possible date for filing. They were promptly hit with a £100 fine for late delivery!

The argument boiled down to whether or not 10 months from September 30th is July 30th or July 31st. As accounting periods end on the last day of the month, the company claimed it was only natural for the filing period to run to the last day of the month as well. The Registrar claimed that 10 months from any date was until the equivalent date in that following month.

This followed a ruling by Lord Diplock in Dodds v Walker, where he stated that: “the general rule is that the period ends on the corresponding date in the appropriate subsequent month, ie the day of that month that bears the same number as the day of the earlier month on which the notice was given. … Because the number of days in five months of the year is less than in the seven others the inevitable consequence of the corresponding date rule is that one month’s notice given in a 30-day month is one day shorter than one month’s notice given in a 31-day month and is three days shorter if it is given in February.”

It was claimed that such a rule is “simple”. But anyone who’s ever had to deal with date calculations knows that nothing is simple in this field.

Thankfully Lord Russell provided a further refinement of the rule in the same case: “Sometimes it is not possible to apply directly the principle, for instance if a four-month notice is served on 30th October (the time beginning to run at midnight 30th-31st October), there being in February but 28 (or 29) days it is not possible to find a corresponding date in February and plainly a corresponding date cannot be sought in March; the application of the corresponding date principle in such case can only lead to termination of the four-month period at midnight 28th February-1st March (or midnight 29th February-1st March in a leap year). That is an inevitable outcome.”

With such a ruling by the House of Lords many years earlier, it seems Radio-Tech had had no chance. But that was nothing compared to the case taken by Pow Trust and its subsidiary, Al’s Bar and Restaurant, against their similar fines. Faced with £100 fines each, they argued (in “protracted correspondence”) that they were a charity with limited funds, and they were only late by a couple of weeks anyway, and one of the two directors had been sick at the time. The Registrar didn’t budge, and so they sought judicial review to quash the penalties, claiming, for good measure, that the fine was an unlawful breach of their human rights.

If ever a case was doomed for failure this was it. The judge ruled against them in every way, stating that the Registrar did not have the discretion to waive the fine, as it was imposed by the Act, not the person. He then raised the obvious question: if the charity had such limited funds that it would challenge a £100 fine, what was it doing undertaking such expensive and speculative litigation – particularly without even taking legal advice. He then referred the matter to the Charity Commission for investigation.

Fighting the registrar doesn’t seem to be a good idea!

Tags:

Mutiny at the Maypole

November 15th, 2004 No comments

For the last few months I’ve been a slightly more than casual observer of the Maypole project. Although I don’t actually run any sites on Maypole, it’s based on rather a lot of my public code, and a lot of issues people raise on the mailing list aren’t really about Maypole, so much as Class::DBI or CGI::Untaint or Class::DBI::FromCGI or somesuch.

It’s also been interesting to watch as, although it’s not directly connected, Maypole seems to have been heavily influenced by Kasei’s internal FireCore framework which Simon had to work with for the guts of a year. He threw away lots of our mistakes, implemented some of the things we’d talked about but hadn’t yet gotten around to, and, being Simon, took some of the ideas much further than we’d imagined. So I was keen to see how it would hold up in the wild.

Of course one of the first things people wanted was to replace the dependency on Template::Toolkit, and be able to use any of the myriad of Perl templating systems. In hindsight I believe implementing this to have been the first major post-release flaw.

I’ve been a student of web abstraction frameworks for a few years now, and the siren song of many of them is the idea that depending on any given component is a problem. Every part should be capable of being swapped out for an equivalent. In database backed web-based systems in particular this means you shouldn’t be tied to any given database or database abstraction layer, or to any given templating system. I don’t know whether it’s a false hubris, or just a good old fashioned desire for world domination, but there’s a pervasive idea that the framework should be capable of doing anything and everything you desire.

But I’ve come to believe that exactly the opposite is true. Frameworks have most power when they aim to do one thing well, and become tightly entwined around the components that make them up. In Maypole’s case, its initial goal was to make it really trivial to build database backed web systems around Class::DBI and Template::Toolkit. Lots of people build such systems using precisely those components, and they all repeatedly face and solve the same problems, time and again. Maypole neatly bundles up and encapsulates one path of building such sites, freeing developers up from the drudgery to concentrate on the value-added business logic.

But converting such a framework to hot-swappable components restricts the amount of best practice than can be neatly encapsulated. Each RDBMS/OO mapping layer does some things better than others. Each templating system, likewise. A framework committed to one of each can play to their strengths. A framework allowing interchangeability has to reduce itself to lowest common denominator.

One the advantages Maypole had over FireCore was a set of default templates. Simon now regrets building these, as they were so good that people believed they should be able to use them for everything, when for most applications most people will need to write their own. But, tied to Class::DBI and Template::Toolkit, Maypole would be able to create much better default templates, making better use of CDBI’s introspection methods, and TT’s VIEWs, MACROs, and Plugins. In a more generalised world this becomes much harder, and the framework becomes blander and blander.

Nothing can be everything to everyone. Too many frameworks try, and end up being used by almost no-one other than the person who wrote it – mainly because they’re the only person who can ever find their way through the maze of twisty abstractions.

Behind my beliefs on this lies one often overlooked truth: frameworks are hard. They’re much more about philosophy than technology. Early design mistakes get magnified dramatically, usually in direct proportion to the level of abstraction you’re aiming at. And the more you build the framework in isolation from the sites you’re building using the framework, the more likely you are to make those mistakes. And once they’re made they’re really hard to recover from.

I once consulted for a company who had what we came to call “three legged cow syndrome”. They had developed a basic content management system that, like many of these things, had morphed into a product that could, of course, do anything any client (and particularly any potential client) wanted. And every time someone came with a request for something the system didn’t already do, they tweaked the system so that it could do that in future. After all, that’s just good practice.

Of course, each time they did this, they codified a hybrid of generic and specific requirements – mainly because they couldn’t know the difference.

Because the first client who ever wanted a certain feature had certain business rules associated with how that feature would work, the code assumed that every client who wanted that feature must work the same way. But of course, every client’s process was different. And, almost invariably, insane. It’s the nature of business systems. They evolve over time to account for all manner of foibles. As technologists we want to simplify these things, and refactor them all away.

But almost every real-world business has all manner of bizarrely crippled logic underlying their business rules. They’re all three legged cows. And in this company every client who later wanted the system to do something slightly differently (as they all did) was treated as if they were insane. Because everyone knows you don’t do that like that – you do it like this. And when they finally prevailed, the developers would have to spend weeks untangling the code to work out what was common and what was unique to each client.

The only way around this syndrome that I know of is to implement the first client’s additions in isolation, as some sort of standalone plugin or add-on. Then the second time someone comes in with something similar do the same, based on what you’ve learned the first time. The third time you can begin to factor out the commonality. Cautiously.

There’s been a lot of furore on this sort of issue recently in the emerging Maypole community. The new maintainer after Simon’s retirement attempted to take the framework too far too quickly. In some ways this speed has probably saved Maypole. By moving at such a rapid pace, no-one could keep up, and people started complaining. If he’d moved much slower, introducing his features one at a time, each one would probably have made seductive sense, and been accepted, until eventually there was nothing left. Frog boiling is a remarkably effective means of changing the direction of any project if you do it slowly and subtly enough.

But now there’s been a fork. Hopefully Sebastian can take the new Catalyst project off to where he wants to go, and Simon F can revert Maypole back to a really good CDBI+TT framework. And hopefully I can avoid being seduced too much, and steal the truly good ideas back for FireCore.

Tags: ,

Practice Week

November 13th, 2004 8 comments

UK TV has never sensibly shown The Practice. I first discovered it via an Ally McBeal cross-over episode. The case began in an episode of Ally McBeal, and then continued in an episode of The Practice. In the US I believe the second half ran immediately after the first half (albeit on a different network, which was in itself unusual for a cross-over), but as The Practice didn’t show in the UK at all, we were just left hanging.

I spent a few years not knowing what had happened, until ITV seemed to pick up the second half of the second season of The Practice and show it at obscure times which changed every week (usually sometime between midnight and 2 am on a Friday or Saturday night). I don’t know whether they showed more of it than that, and I just didn’t discover it until half-way through, or whether they just showed half the season. As far as I know they never showed Season 3, or indeed any other season.

About 6 months ago BBC3 picked up Season 3 and showed it. Again, they chopped and changed the times, but I managed to catch almost every episode.

When I started playing with BitTorrent I was able to download the latter half of Season 8, but as I watching Season 3 at the time I didn’t watch any of them, just in case there were spoilers for what I was currently watching. I hoped that the BBC had picked up more than the one season, but of course, they stopped at the end of Season 3.

Then, when I was in San Francisco for Web 2.0, I managed to catch the first episode of Boston Legal, the new spin-off show from it. I was hooked straightaway, and on further investigatation I discovered that Season 8 of The Practice had pretty much changed focus half-way through to feature these new characters at this new firm (and managed it better than the entire cast change in the last, appalling, season of Ally McBeal). So when I came home I watched those last episodes of the Practice I’d downloaded – and it’s some of the best TV I’ve seen in quite some time. James Spader and William Shatner are both excellent, and raised the level by an impressive amount of what was already a really good show. But now I’m hungry for more! I can download Boston Legal every Monday, but I really want to see the first half of Season 8. And of course there still five and half other seasons I haven’t seen yet! I’ve been hoping for DVD releases, but there’s no sign of that. I’ve scoured all the torrent sites I know, but can find nothing.

Tonight, however, I’ve discovered that the new ITV3 channel is showing episode 2:4 through 2:8 one per day next Monday to Friday. They don’t seem to be showing anything more the following week, but hopefully this will be a regular thing. And at least I get to see 5 more episodes!

The Joys of CSV

November 12th, 2004 No comments

I’ve been working with CSV files a lot recently, mostly as a way of building web based management information tools out of SAGE data.

But I’ve always really hated working with the interface to Text::CSV_XS. So I put together Text::CSV::Simple. You just point it at the file you want, and read out all the rows:

my $parser = Text::CSV::Simple->new;
my @data = $parser->read_file($datafile);

You can tell it you only want certain fields:

$parser->want_fields(1, 2, 4, 8 );

And that you want the results straight into a hashref rather than just a listref:

$parser->field_map(qw/id name null town/);

There are also trigger points where you can pre- and post-process the data.

It’s certainly made dealing with CSV much easier for me. And it seems to be useful for other people too, as within a few weeks of its release I’ve had several feature requests and bug reports. Usually it takes a couple of months for a new module of mine to build up enough steam to get that.

However, I’ve now had several people all report a problem that I didn’t even consider before: it doesn’t handle newlines in strings. This disturbed me as I hadn’t realised until this that CSV files could actually contain embedded newlines! Of course, I can’t find any sensible documentation anywhere of what the CSV file format actually does and doesn’t allow, as it seems that Microsoft just made it a defacto standard by making it the main export format from Excel, without ever really specifying how it can be used. The few sites that I found that claim to provide more details on the format are contradictory (e.g. over the issue of header rows).

But it certainly does seem that linebreaks are acceptable, as long as they’re properly quoted. This shoots my whole approach to parsing the files apart, and means I’m going to have to go back and pretty much rewrite the module from scratch, and I may even have to lose one of my trigger points, as I still want to use Text::CSV_XS to do the actual parsing for me, but I’ll need to hook in at a different level now.

Of course I face my normal Open Source dilemma with this. The code clearly has a bug, but it’s not one that has any effect on me. None of the CSV files I have to deal with have linebreaks inside records. If the code wasn’t released, I’d apply my XP YAGNI principles, and defer the fix until I needed it. In some ways I’d like to be able to tell people who reported the bug that I’ll happily accept a patch if they can fix it, but otherwise they’ll have to wait until I need it. But having public code out there with known bugs irks me, so I guess I’ll just have to find the time from somewhere to fix it myself!

MT Amazon Reading List

November 11th, 2004 No comments

I’ve been asked which plugin I’m using to generate my “reading list” over on the sidebar. Like any true geek, of course, I actually wrote my own. Of course I’m generally into reuse where possible, but I wanted to learn how to write MT plugins, and it seemed like a good place to start. It also helped that I didn’t like any of the 3rd party plugins out there for this. There are probably much better ones available now. Mine also isn’t very good, but it’s part of a bigger plan…

Over the last year or so I’ve gradually been drinking the semantic web kool-aid. I’m sure I’ll rant more about this later, but I don’t believe it’s going to happen the way most people have been pushing for it, but I’m now convinced that it’s going to happen.

Of course I’m part of the problem for making it happen, as I’m a data geek. I collect structured information. My friends laugh at the fact that I could run queries to tell you how much I’ve spent on milk in the last year, but I find the information useful. (Well maybe not that information, exactly, but the general principle of being able to analyze my spending…)

Unfortunately most of the people wanting to make the semantic web happen are also data geeks who believe in structured information, even though the vast majority of the world aren’t. This is a very big problem for traditional semweb thinking, but I no longer think it matters very much.

But, in the meantime, I want to do stuff with my structured information. Such as the list of books I’ve read.

The first problem was how to store them. I’m reasonably well known to be a database guy. I also have a simple framework for building simple web apps to manage databases, so I considered building one for managing my books. But that seemed like too much hassle for now – I really wanted to just edit a file when I started reading a new book.

Faced with this problem, most techies these days seem to instinctively reach for XML. Personally I can’t stand it. I really hate how verbose it is. Unfortunately a large part of the Semantic Web work is also based around XML. Theoretically you can express your RDF in other ways, but really almost everyone is using XML. This used to bother me as I thought I’d need to do this, but now I believe that the more obscure and arcane we can make this stuff the better, as then everyone will want tools to do it, and only masochists will end up doing it by hand.

So for my books I, instead, reached instinctively for YAML. I thought for a while about what information I’d want to store, before realising that I was much too lazy to want to type any information that could be found elsewhere. So my YAML file really just includes the ISBN of the book, and the rough date that I read it. Of course I don’t usually read a book in one day – I quite often read 4 or 5 books simultaneously over a period, just to get an interplay of ideas happening. And there are lots of books I start, read about half of, and don’t get round to finishing for months, or sometimes even years (if at all). I spent a while trying to find a sensible way to model that, before deciding it was all much to complex, and I’d be happy enough with just entering a rough date.

So I ended up with a very basic YAML file:

---
books:
 
   - isbn    : "0596007515"
     title   : "Ggl Hacks"
     date    : "2004-11-01"
     current : 1
 
   - isbn    : "0439977789"
     title   : "Ruby / Smoke"
     date    : "2004-11-01"
 
   - isbn    : "075093204X"
     title   : "Decline and Fall Everybody"
     date    : "2004-10-09"

The ‘title’ field is there just as a placeholder to aid human readability. It never actually gets used anywhere, so I can fill it with shorthand etc. The ‘current’ field is for books I’m still reading. This is my token concession to the “I started this a month ago but haven’t finished yet” problem.

The next phase is to turn that into a more detailed YAML file that includes proper titles, Amazon links, cover URLs etc.

I have a small perl script to do that:

#!/usr/bin/perl
 
use strict;
use warnings;
 
use YAML;
use Net::Amazon ();
use Cache::File ();
 
my $yaml = YAML::LoadFile(shift || "reading-yaml.txt");
my @out = map expanded_data($_), @{ $yaml->{books} };
print Dump { books => \@out };
 
sub expanded_data {
  my $book = shift;
  my $property = get_book(sprintf "%010s", $book->{isbn});
  return {
    %$book,
    isbn  => sprintf( "%010s", $book->{isbn} ),
    title => $property->title,
    img   => $property->ImageUrlSmall,
    url   => $property->url,
  };
}
 
BEGIN {
  my %amzn_opt = (
      token        => "MY_AMAZON_KEY",
      affiliate_id => "tmtm-20",
      cache        => Cache::File->new(
        cache_root      => '/tmp/amzn_cache',
        cache_umask     => 000,
        default_expires => '30 day',
      ),
  );
  my $us = Net::Amazon->new(%amzn_opt);
  my $uk = Net::Amazon->new(%amzn_opt, locale => "uk");
 
  sub get_book {
    my $isbn = sprintf "%010s", shift;
    my $resp = $uk->search( asin => $isbn );
    $resp = $us->search( asin => $isbn ) unless $resp->is_success;
    die "Can't find $isbn" unless $resp->is_success;
    my ($property) = $resp->properties;
    return $property;
  }
}

It simply reads in my raw book file, uses Amazon Web Services to look up more data about the books, (storing the data in cache for 30 days to speed the whole thing up on later runs), and throws out a new YAML file with more fields. Amazon US has slightly more likelihood of having cover scans, so I check it first falling back on the UK if there’s no results there. I pick up a lot of my books in the US anyway, so it isn’t that much of an issue, although I occasionally a different cover from the one that I have.

Then I have a simple MT plugin, called mt-reading.pl which I drop straight into my MT/cgi-bin/plugins/ directory:

package MT::Plugin::ReadingList;
 
use lib '/usr/local/MT/cgi-bin/lib';
 
use MT::Template::Context;
use Data::BookList;
 
MT::Template::Context->add_container_tag(
  ReadingList => sub {
    ( my $ctx, $args ) = @_;
    my $builder = $ctx->stash('builder');
    my $tokens = $ctx->stash('tokens');
 
    my $yaml_src = $args->{src}
      or return $ctx->error("No YAML source file specified.");
 
    my $list = Data::BookList->new($yaml_src)
      or return $ctx->error("Invalid YAML source file");
 
    my $content = "";
    for my $book ( $list->reading_list($args) ) {
      $ctx->stash( book => $book );
      $content .= $builder->build( $ctx, $tokens );
    }
    return $content;
 
  }
);
 
MT::Template::Context->add_tag(
  ReadingListBook => sub {
    my $book = shift->stash('book');
    my $args = shift || {};
    $book->{cover} ||= sprintf qq{<a xhref="%s" mce_href="%s" ><img
      border="0" alt="%s" xsrc="%s" mce_src="%s" /></a>},
        $book->{url}, $book->{title}, $book->{img} || "";
    return exists $args->{display}
      ? $book->{ $args->{display} }
      : $book->{cover};
  }
);
 
1;

This simply adds two new tags ‘ReadingList’ and ‘ReadingListBook’ that I can add to my MT templates, and have them expanded at build time.

So, in my template I include something like this:

<p>Recent Reading</p>
<div class="book">
  <MTReadingList src="/path/to/reading.yaml" lastn="9">
    <$MTReadingListBook display="cover" $>
  </MTReadingList>
</div>

The only remaining piece is the Data::BookList module, which is a simple ‘load the data from YAML, and return whichever ones I want’:

package Data::BookList;
 
use strict;
use warnings;
 
use YAML;
 
sub new {
  my ($class, $src) = @_;
  my $books = YAML::LoadFile($src) or return;
  bless { _booklist => $books->{books}, }, $class;
}
 
sub reading_list {
  my ($self, $args) = @_;
  my @books = @{ shift->{_booklist} };
  if (exists $args->{current}) {
    @books = grep $_->{current}, @books;
  }
  if (exists $args->{lastn}) {
    @books =
      (sort { $b->{date} cmp $a->{date} } @books)[ 0 .. $args->{lastn} - 1 ];
  }
  return @books;
}
 
1;

This allows me to ask for only ‘current’ books and/or the ‘lastn’ books: currently 9 for my blog. I plan to add more features here later, but for now this does what I need.

In some ways this is all over-complicated if all I wanted was a ‘recent reading’ section on my blog. But I find the separation of concerns useful. Managing my raw data is distinct from fetching information about it, which is distinct from slicing that data up, which is distinct from presenting it on my blog. So, when I find an ontology for expressing all this in RDF I should really only to write a new presentation script.

Of course, in practice, the ontology will specify some fields that I don’t currently store, so I’ll probably need to also expand the amazon lookup code, and it’ll probably want me to do my dates differently, etc., but that’s the theory anyway!

Bizarre Links and Bloglines

November 10th, 2004 No comments

Smylers has just pointed out to me that, for those of you reading this via Bloglines, all my URLs are screwy. Instead of saying things like http://www.kasei.com/, they’re just saying //www.kasei.com.

And although Mozilla, IE, and SharpReader Do The Right Thing here, Bloglines doesn’t. Of course, it’s hard to know what The Right Thing actually is here. When I said DTRT above, I really meant Do What I Mean (which of course is always The Right Thing!)

Fixing this problem turns out to be non-trivial. I’m using Marty’s MT Kwiki Plugin, but it doesn’t really do anything except run the text through CGI::Kwiki. A little investigation on our internal wiki reveals that the problem lies somewhere in CGI::Kwiki itself, as the same problem shows up there too.

But CGI::Kwiki has been supplanted by Kwiki, and I’m not sure there’s a simple upgrade path…

Tags:

1066 and all that

November 10th, 2004 3 comments

As well as posting about things I do, I’m also going to be posting about things I’ve learned.

I’ve ranted here before about the deficiencies in my education, and much as I keep promising myself that I’ll do an A-level in History or Literature or Art History or some such, I just never get around to it. But I can force myself to investigate one topic a day on Wikipedia and fill in a lot of the gaps.

Today’s investigation, prompted by a little note at the end of Paul Graham’s recent essay on essays, was into the Battle of Hastings. This is one of those things that everyone growing up in the UK should know something about. But until a couple of years ago my knowledge didn’t really stretch much beyond the image from the the Bayeaux Tapestry of King Harold with an arrow in his eye. Then I saw a TV program on the invasion from the North just beforehand. I discovered that one of the main reasons for the victory at Hastings was that Harold had just marched the remains of his troops hundreds of miles south from the Battle of Stamford Bridge, where he’d successfully warded off a Viking invasion from Norway.

Today I learned several other important facts about this.

Firstly, I discovered that the Normans were also really Vikings (North Men), who had invaded France at the end of the 9th Century, and after besieging France had been given Normandy in exchange for protecting the country from pirates. So Harold had really been fighting off Viking forces from both ends of the country.

Then I also discovered that neither invasion was really just another “let’s go invade England lads” attack. When King Edward the Confessor died earlied in 1066 he had left no children, and there was a power vacuum and great debate of who should succeed him to the throne. Harold, who at this stage was the Earl of Wessex, East Anglia and Hereford, and thus had been the second most powerful man in England, persuaded the Witenagemot (the predecessor to Parliament) to vote to appoint him as King.

Meanwhile, Harald III of Norway, backed by Harold’s brother Tostig, claimed that several generations of intermarriage gave him the right to the English throne, and came to claim it, only for both to be killed at the aforementioned Battle of Stamford Bridge.

Simultaneously, William The Bastard, the Duke of Normandy, decided that he should be heir, as not only had King Edward been his cousin, but that Edward had promised him the throne years earlier. For good measure he also claimed that when Harold had been shipwrecked in Normandy a few years earlier he had promised to support William’s claim to the throne upon Edward’s death.

And, just to complete the triangle, it seems that Harold’s brother Tostig was married to Judith of Flanders, who was William’s wife’s aunt.

It seems that this whole area is much more complex and deeply intertwined than I knew!

Tags:

Back Again

November 10th, 2004 No comments

It’s certainly been an eventful 6 months since I last posted.

Back in May we took over Ireland’s oldest ISP and have spent the last 6 months turning it around. They seemed to have an interesting business model whereby they would take all the revenue, give 50% of it to suppliers, 50% of it staff, and spend the other 50% on overheads.

I can’t say much more about it all here yet, as there are still six ongoing lawsuits, but I’m sure I’ll get to tell the stories some day. You really won’t believe some of them (like the story of the directors who locked themselves in their office and refused to talk to us…)

Conference Season was interesting this year, whilst all this was going on. We ended up having to skip Oscon after O’Reilly messed up our tutorials, but I got to go to FoafCamp and FooCamp in Amsterdam, the FOAF Workshop in Galway, Web 2.0 in SF, and of course we were hosting YAPC::Europe this year. I’m sure I’ll get to talk more about those later.

The takeover also meant we had to put most of our ongoing projects on hold for a while. Simon and Marc have both moved on to other things, and Marty, Karen, and I have been working full-time at UNITE.

We said we’d put pretty much everything else on hold for six months, and so it’s time to start digging some of those out again. Everything moves so fast that we’ve had to rethink some of them significantly. Twingle, of course, now has Gmail to contend with. That doesn’t worry us too much though, as we believe that Twingle’s value is a lot more than just search. More on that later too.

This blog is probably going to be different this time around too. I used to use it as a place to store interesting things I came across. I’ve now switched to using del.icio.us for that, so this will be much more about what I’m doing. Hopefully that won’t be too boring for everyone else.