Most recent posts...

My Volvo 1800S

I’ve been a bit remiss in posting these photos, but a friend reminded me yesterday that I’d promised to show off my “new” car.

Way back when I lived in England I owned a red 1969 Volvo 1800S, a rare B20B version (that is, a 2000cc, non-fuel-injected engine). Only 1693 were ever produced since Volvo brought out the 1800E pretty quickly with a fuel injection system added (E stands for einspritzung, the German for fuel injection, since the system used in the Volvos was produced by Bosch).

That car was nice-looking enough that it was the October picture in the Classic Cars calendar of 1991. It was a fun day I had with the photographer, driving all over Rochester in Kent, trying to get the perfect picture. The one published was taken outside Eastgate House in Rochester High Street, although we drove up to the castle and down to the Medway as well. I’ll post a photo of that calendar page later.

Once I moved to the States in 1993, I had to sell it. I couldn’t afford the shipping to Colorado and the car needed to be driven and looked after otherwise it would just have rotted away. So in 1995 I finally found a buyer and sold it and silently regretted it.

Anyway, I’ve been looking for a reasonably-priced red 1800S for the past year or so, one that has already been restored. I finally found one in California in July, a 1964 version with a B18B engine, and bought it one of the weeks I was in the DevExpress offices in Glendale. I had it shipped to Colorado (no way was I going to drive an unknown car 1000 miles home, especially one that had only been driven some 200 miles in the last 5 years). This was it on the Friday it was delivered:

My volvo gets delivered

The very next Monday I took it to Concours Cars in Old Colorado City for them to thoroughly check it over and retune it for the altitude. And it was a good job I did too: the heater core had a leak and the car was losing coolant like there was no tomorrow. (Boy was I glad I hadn’t decided to drive it back from California.)

In the end, they kept it for nearly a month fixing various systems and bits and pieces and replacing oil, fluids, belts, etc. I’m going to guess that whoever restored it ran out of money after doing the bodywork and rebuilding the engine since there were quite a few minor problems, apart from the heater core leak. Egregious examples: the headlights weren’t connected to the switch; the cable for the flap for the defroster was missing (besides which the flap itself was broken); there was no windscreen washer system at all apart from the nozzles. They also decided that the carburetor needed to be replaced (whatever fuel additive the previous owner had used had rotted the jets while it was in storage). There’s still a few little things to fix (which they’ll be doing over the winter), but at least they made sure the car was drivable and legal to drive.

Here’s the front, showing the cowhorn bumpers and the aluminum “egg-crate” grill (and the crappy “VOLVO” plate that is screwed on with some security screws that will have to be drilled out):

The front of my Volvo 1800S

And here’s the rear, showing that I still need to register it in Colorado. The plate reads “64SAINT”, because it’s a 1964 car and The Saint, played by Roger Moore in the TV series, used to drive one in the 60s. I might go for the same plate here, if it’s available.

The rear of my Volvo 1800S

(You can see my set of pictures of the car on Flickr. I’ll keep updating it as I take more photos.)

Let me just say that the car is just awesome. It’s great fun to drive around town, even without power steering (the steering wheel is huge though and my upper body strength is improving!). Now I know how the automatic choke works I can even start it from cold without cranking and cranking the starter. It gets a bit noisy on the interstate (besides which I don’t really go above 60mph in it until the rebuilt engine has had a chance to settle down) and turning the air conditioning on just makes it noisier still. And the wheels are too gaudy for my taste (going to go for some Panasports later). But... overall, it’s just brilliant.

Album cover for MutedNow playing:
Alias - lost friend advice
(from Muted)


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

Rubik’s Cube iPhone app

A couple of months ago I finished an article for PCPlus about algorithms for solving Rubik’s Cube. It’ll appear in issue 298 in September 2010.

As part of my research I came across this article and video on Wired about an iPhone app that helped you solve it and, more than that, solve it in a remarkably small number of moves (usually 20 or fewer) using Kociemba’s algorithm. The free app (called CubeCheater) was written by Eric Faller. Unfortunately it seems he didn’t request permission from Seven Towns (the current owners of the license to market Rubik’s Cube worldwide) and had to remove the app. (Aside: my editor at PCPlus, Alex Cox, obtained permission from them for me to write about Rubik’s Cube for the magazine before I ever put electronic pen to Microsoft Word paper.)

Bummer. I would have liked to try the app and written about it as well. But, no go, so I submitted the article and forgot about it.

Imagine my surprise when this weekend, I was perusing the App Store when I came across the official Rubik’s Cube iPhone app. Further imagine my surprise when I saw that said app had exactly the same solver function as CubeCheater. Not only that, but the same interface.

Rubik's Cube iPhone app Solver interface

(Compare this to the interface shown in the video taken 18 months ago.) Interesting, no?

Anyway, I bought it ($4.99) to try it out. The only part of the app I was interested in was the Solver function where you input the state of a mixed-up cube and it solves it for you in as few moves as it can.

There is a cool feature where you input the faces using the camera rather than painting each cubelet with colors from the palette. You take a snapshot of the cube and the software works out the face’s grid and the colors in each cubelet.

For me and my particular cube this functionality is a complete and utter failure. The edge detection is pretty bad to begin with (hint: don’t try and fill the camera screen with the face like the image below, but make it occupy as much room as the image of the face above), but the color recognition just sucks. Here’s my white face (so called because it’s named after the center cubelet):

Actual white face on physical cube

And here’s what the app thought it was:

Interpretation of physical white face

There’s another problem which the app doesn’t address. For some unknown reason — perhaps because my cube is so old (I purchased it in 1979 before Ideal Toys got the original license to market the puzzle worldwide in 1980) — my cube center cubelets don’t follow the current standard positioning. I have red on the opposite side to white, not yellow. In fact, yellow and red are reversed on my cube, so, even if the camera input method worked, I’d have to fiddle with the colors anyway (wherever the app talks yellow, I have to think red, and vice versa).

OK, so given that for my physical cube I have to remember to switch yellow and red, does it work? Does it calculate a solution with a small number of moves? The answer is yes. It’s quite magical if you look at the cube after each move and see the colors slowly coming together.

I don’t particularly want to rate the app officially (after all, I haven’t tried the other parts of the app: solving a virtual cube on the screen with flicks of the finger, or the tutorial section), but I will admit to being very disappointed in the camera interface. Unlike this Sudoku Grab app, the AI in the Rubik’s Cube iPhone app is not that good at all.

Album cover for I Don't Know What You Want But I Can't Give It Any MoreNow playing:
Pet Shop Boys - I Don't Know What You Want But I Can't Give It Any More [the Morales Remix]
(from I Don't Know What You Want But I Can't Give It Any More)


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

PCPlus 283: Learning the ropes

For July 2009, I managed to snuff out something about ropes, a kind of heavier programming type than string. Apart from the pun/joke, it was an interesting article to research. I have no recollection any more about how I came across the rope type; presumably it was through a late night surfing session, fueled with some microbrew.

Ropes are like strings in that they store text, but unlike strings in that the bytes making up the text are no longer contiguous in memory. A rope will split up the text into nodes and build up a tree with them. The original text can be recovered by reading the nodes in an in-order traversal.

Why would anyone do such a thing? Well it’s great for building up a string through lots of insertions/deletions — in effect it’s the same performance argument as inserting into/deleting from an array versus a linked list — and it’s good for really long strings. The final benefit is all about heap memory usage: long strings (or any large allocations) in run-times like .NET tend to stick around after disposal since the garbage collector is tuned more to small allocations rather than large ones.

Of course, these benefits come at a cost: for smaller pieces of text, the effort in manipulating them (reading the nth character, copying them, etc) tends to have high overhead, both in terms of memory and in terms of performance. So, not for every situation, by all means.

I couldn’t find a reference implementation of ropes in C# or .NET, but there is one for Java as part of this discussion here. Personally speaking, I’d have to say that the StringBuilder class in .NET would suffice in many scenarios and the effort of creating an implementation of a rope class probably not worth the effort.

This article first appeared in issue 283, July 2009.

You can download the PDF here.

(I write a monthly column for PCPlus, a computer news-views-n-reviews magazine in the UK (actually there are 13 issues a year — there’s an Xmas issue as well — so it’s a bit more than monthly). The column is called Theory Workshop and appears in the Make It section of the magazine. When I signed up, my editor and the magazine were gracious enough to allow me to reprint the articles here after say a year or so.)

Now playing:
Ferry, Bryan - Tokyo Joe
(from In Your Mind)


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

Restoring a system from Windows Home Server

Recently it seems that I’ve been banging my head against the ceiling of my 128GB drive in my laptop. My drive comes up red in Windows Explorer every now and then and red is the color that makes you panicky. And before you say, “128GB? How old is this laptop?” let me explain that it’s an SSD and that’s all I could afford at the time I upgraded the drive.

Bucknall data center - NOTNewegg had a deal on this week with the Crucial ReadSSD 256GB — the price has since gone up again — so I pulled the trigger and bought one. Twice as much space should do me for a while. The Crucial is a nice bit of kit with some really rapid read/write timings and TRIM support in Windows 7. I think all new SSDs now support TRIM, but my current Super Talent MasterDrive SX didn’t (actually there’s now a firmware update you can apply — which wipes all data, note — which adds that support) and I’d have to say that I’ve noticed the drive seems a little sluggish with writes.

Since I decided to restore from Windows Home Server and ran into a few little gotchas as I did so, I thought I’d write it all down for next time or to help you out if you’re about to venture down the same path.

I made sure I made a final up-to-date backup onto my Windows Home Server (WHS), removed the old drive, and installed the new one.

To restore a drive’s contents from WHS, you use a special Restore CD. Boot up with that and follow the prompts, basically. Although your WHS hardware came with a Restore CD, Microsoft recommend that you download the latest ISO file from their site before doing the restore to make sure you have the best version that will work with the (probably frequently updated) WHS OS on your box. Fine, did that, burned the ISO, got a new bootable CD.

Since this was essentially the first time I was restoring a drive completely from WHS, I also found a site that went through the steps in nice gory detail (or at least seemed to).

I booted up into the Restore CD and followed the first few steps. Just like in my noob’s guide, the Restore CD didn’t recognize my network adapter and you absolutely must have that set up otherwise you won’t be able to connect to your WHS. I clicked on the “Where can I find drivers for my hardware?” link. The help came up and explained that every time you make a backup, WHS saves your drivers in a special folder on the server for just this eventuality. No problem, then. I followed the instructions and copied the drivers onto a USB drive. After plugging it into my laptop, I clicked on the Install Drivers... button and scanned for them. Success, it found the drivers and...

...They did didn’t show up in the Detect Hardware dialog. WTF?

I tried again: no show. I was a bit stumped, so looked at the USB drive, thinking that perhaps the drivers had to be in the root instead of in the weirdly named folders WHS had put them in. However, something in those weird names gave me pause: the letters “64”. Sure enough, they were 64-bit drivers since my laptop was running 64-bit Windows 7. Therein lies Gotcha no. 1: the OS booted up by the current Restore CD is a 32-bit OS. It can’t use those 64-bit drivers. There is no 64-Bit Restore CD at the time of writing, although I believe that the new version of WHS will include one.

So it seems I had to get the 32-bit drivers onto this USB drive. I visited the Dell site and downloaded the 32-bit drivers for the wireless adapter. Dell’s driver downloads work by unzipping a bunch of files into a folder and then running an install program. In essence I got the download to unzip the files onto the USB drive and then cancelled the installer. The drivers were unzipped into some sub-sub-folder.

Over to the laptop again: reboot and get it to find/install the drivers. Success: the wireless driver was found, so it was onto the next step: searching for my WHS over the network. It failed. I tried again and it failed. I tried entering the name of the server: it failed. Bummer.

OK, then. Back to Dell I went and downloaded the Ethernet 10/100 adapter drivers instead. Same rigmarole (unzip to USB, stop installer) and then reboot the Restore CD. It found the new drivers and this time found the server. I was in!

And then I suddenly realized why using the wireless drivers failed: it wasn’t the drivers, it was the fact that my wireless router is protected with a password. This is Gotcha no. 2: the Restore CD does not prompt you for the wireless router password. You either turn off security on your wireless router (and presumably it all works but your neighbors have a field day stomping over your Internet access) or you use a wired connection instead to do your restore. Another advantage to wired is that it’s a bit faster, so that’s what I continued with.

After that it was all a bit of a downer: I partitioned the SSD, formatted, and the restore is still going on.

Album cover for Luck Be A Weirdo TonightNow playing:
Fila Brazillia - Lieut. Gingivitis Shit
(from Luck Be A Weirdo Tonight)


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

PCPlus 282: Understanding ternary trees

June 2009’s article was a reversion to what might be called straight computer science after a few months of layman’s topics (indexing the internet, spellchecking, etc) and covered ternary trees. Quick overview: ternary trees are a speedy, space-efficient data structure for storing large numbers of key-value pairs that in certain situations are better than hash tables.

PCPlus logoFor some reason, ternary trees really gelled with me way back when I first found out about them. They were invented by Jon Bentley and Robert Sedgewick and first described in Dr Dobbs in April 1998 (article). I actually wrote about them in June 1998 in The Delphi Magazine (a pretty quick turn-around, considering it had code as well — although buggy as I discovered later) and presented a session on them at DCON 1999 (with corrected code). So it was good to get back to them some 11 years later for another audience.

The article does a pretty good job discussing the precursors to the invention and shows why ternary trees are so important for key-value lists.

For some reason, although there were a couple of nice images of trees that enhanced the article, the editor or page designer put in a picture of a Sierpinski triangle (or gasket, as it’s sometimes known) which, unfortunately has nothing to do with ternary trees. Well, apart from the association with “three” I suppose.

This article first appeared in issue 282, June 2009.

You can download the PDF here.

(I write a monthly column for PCPlus, a computer news-views-n-reviews magazine in the UK (actually there are 13 issues a year — there’s an Xmas issue as well — so it’s a bit more than monthly). The column is called Theory Workshop and appears in the Make It section of the magazine. When I signed up, my editor and the magazine were gracious enough to allow me to reprint the articles here after say a year or so.)

Album cover for PromiseNow playing:
Sade - War of the Hearts
(from Promise)


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

Viewing divs with “overflow:auto;” on the iPhone

In playing around with my blog’s new iPhone support I came across a doozy of a problem.

I display all of the code quoted in one of my blog posts in a special div that has the overflow style attribute set to auto. On desktop browsers, these divs are rendered in a block with horizontal and vertical scrollbars. If the lines are too wide for the width of the div they’re displayed in, the horizontal scrollbar is activated; similarly if there are too many lines to fit vertically (I set max-height to 400px currently), the vertical scroll bar is activated. Here’s an example of some code from a recent post, so you can see the effect I’m talking about:

  class SafeStackItem<T> {
    public T Value;
    public Int32 Next;
  }

  class SafeStack<T> where T : class {
    private Int32 head;
    private Int32 count;
    private SafeStackItem<T>[] array;

    public SafeStack(SafeStackItem<T>[] array, int pushFrom, int pushCount) {
      this.head = -1;
      this.array = array;

      count = pushCount;

      head = pushFrom;
      for (int i = 0; i < pushCount - 1; i++)
        array[i + pushFrom].Next = pushFrom + i + 1;
      array[pushFrom + pushCount - 1].Next = -1;
    }

    public Int32 Pop() {
      while (count > 1) {
        Int32 oldHead = head;
        Int32 oldHeadNext = Interlocked.Exchange(ref array[oldHead].Next, -1);

        if (oldHeadNext >= 0) {
          if (Interlocked.CompareExchange(ref head, oldHeadNext, oldHead) == oldHead) {
            Interlocked.Decrement(ref count);
            return oldHead;
          }
          else

            Interlocked.Exchange(ref array[oldHead].Next, oldHeadNext);
        }
      }

      return -1;
    }

    public void Push(Int32 index) {
      Int32 oldHead;
      do {
        oldHead = head;
        array[index].Next = oldHead;
      } while (oldHead != Interlocked.CompareExchange(ref head, index, oldHead));

      Interlocked.Increment(ref count);
    }
  }

However on the iPhone there are no scrollbars. How the heck are you supposed to scroll wide lines from left to right or many lines up or down?

It turns out that iPhone’s mobile Safari has a special trick up its sleeve: you use two fingers. Place two fingers in the block and move them simultaneously. You’ll find that you can scroll the text up/down, left/right. Try it and see using the above code block.

Album cover for AffectionNow playing:
Stansfield, Lisa - Affection
(from Affection)


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

Adding support for iPhone with GraffitiCMS

This blog uses GraffitiCMS as the blogging engine. This software has now been open-sourced by the original developers, Telligent, and is available on CodePlex. Although it’s pretty full-featured and does most of what I want and need from a blogging engine (and has lots of features I don’t use) there is no built-in support as yet for providing a special view for mobile devices.

Consequently, when you view the site on an iPhone, say (since this is what I use as a mobile phone), it displays the wide full look (currently 3 columns across) in a much shrunken form. Better would be to display the site in a single column and — even better — to not display the full text of the usual 10 articles shown on the front page. So, this week, after helping sort out some Medium Trust issues one of the patches had introduced (and that had left my site in a bit of a fragile state), I set out trying to find a way to create a special view of the site for the iPhone.

The first hint was a package called Graffiti Extras. It’s available on CodePlex at version 1.3, but hasn’t been updated for about 18 months. It contains a plug-in called Mobile Theme Selector. Put simply, this plug-in installs itself into GraffitCMS and, when a request is detected and the user agent string passed by the browser indicates a mobile device, the code switches the theme for the request. The theme switched to is one you write in the normal manner — views and CSS files — but that is optimized for a mobile device.

Sounds simple enough, and I set it up, but it didn’t work. I’d connect with my iPhone and still got the usual full view. Meh.

I looked at the code: in essence, in order to identify a mobile device, all that happens is that the user agent string is tested to contain “IEMobile” (presumably for Windows Mobile devices) or that the Browser object’s IsMobileDevice returns true. Well, I knew the first would fail, but the second?

  if ((HttpContext.Current.Request.UserAgent.IndexOf("IEMobile") > -1) ||
      (HttpContext.Current.Request.Browser.IsMobileDevice))
  {
    GraffitiContext.Current.Theme = MOBILETHEMENAME;
    ...
  }

Time to investigate IsMobileDevice; surely it should recognize the iPhone?

It turns out, apart from some default behavior, IsMobileDevice uses an external definitions file in order to decide whether the user agent string identifies a mobile device. And, lo, that definitions file is also on CodePlex (here).

Once you download it, you should extract the mobile.browser file and place it in the /App_Browsers/Devices folder of your web application (if the folder doesn’t exist yet, create it). Restart your application (in my case, that’s GraffitiCMS) and you should find that the iPhone is recognized as a mobile device.

Next time, I’ll talk about what needs to be done in order to display a page optimized for the iPhone.

Now playing:
Lisa Stansfield - All Around the World
(from Affection)


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

PostFix to Infix: converting RPN to algebraic expressions

Yesterday afternoon I finished my latest PCPlus article on generating all possible arithmetic expressions with four operators. The article explored several algorithms, such as evaluating all full binary trees with a certain number of internal nodes (mine was four), evaluating an expression tree, and the like, and for the sidebar I slipped in a quick bit about RPN (Reverse Polish Notation) and how succinct it is for describing arithmetic expressions (there’s no operator precedence or parentheses to worry about). Equally important is the absolute ease with which you can evaluate an RPN expression compared to an algebraic one (that is, an expression using the standard infix notation).

Growing treesI sent it off but then started to think about how to convert an RPN expression (say, 1 2 3 4 5 + × - ÷) into its algebraic equivalent (1 ÷ (2 - 3 × (4 + 5)), or 0.04). The reason for doing this is to keep and use the speedy succinct RPN form internally, but to display any result in the normal format. There’s lots of information online about doing the reverse operation — that is, converting infix to postfix, for example Dijkstra’s Shunting-yard algorithm, which I first implemented at university using FORTRAN (shudder) — but virtually none about doing the opposite (and some of them I’ve seen even assume that the postfix expression has parentheses, for heaven’s sake).

So, as I said, I thought about it for a while and came up with this answer.

The easy algorithm is to read the RPN expression as if you were going to evaluate it but build up an algebraic expression instead.

Let’s show this with 2 3 + 4 ×. We read the 2 and push it onto the stack. We do the same with the 3. The next token is +, which we process by popping the right-hand operand (call this the rhs for right hand side), the left hand operand (lhs), forming an algebraic expression with parentheses: (2 + 3) and then pushing it onto the stack. Push the next token, the 4. The next token is ×. We pop the rhs (the 4), the lhs (the bracketed expression), form a new expression as before: ((2 + 3) × 4), and push it onto the stack. There’s no more RPN expression left, and so the answer is the final string on the stack. Not too bad, expect for the superfluous parentheses around the entire answer.

The problem with this simple algorithm is that it pays no attention to precedence and to avoid any problems with it surrounds each sub-expression with parentheses. For example, 2 3 × 4 + would be converted to ((2 × 3) + 4), instead of the more succinct, yet unambiguous 2 × 3 + 4.

So how can we improve on the situation? First of all we assign a precedence number to each of the four arithmetic operators: add and subtract get 1, and multiply and divide get 2. That way we can easily say that, for example, multiply is of greater precedence than addition (that is, given a choice between multiply and divide, we do the multiplication first).

We’re going to build up an expression tree from the RPN expression instead of a simple string as in the previous algorithm. We proceed as before but now the stack will store nodes of the expression tree.

Let’s show this with 2 3 + 4 × again. We read the 2, create a node to hold it, and push that node onto the stack. We do the same with the 3. The next token is +, which we process by popping the rhs, the lhs, and form a mini tree with a new root node to hold the +.

First step in creating the expression tree

We push the root node, the operand node, onto the stack. We then read the 4, so create a node for it, and push that. The next token is ×. For this we pop the rhs, then the lhs, and form a new tree with the × operator as root:

Second step in creating the expression tree

This new root gets pushed onto the stack. As before, we’ve run out of RPN expression and so the answer is the top item on the stack. Of course, we’re not quite there yet: an expression tree is not an algebraic expression, but we’re close.

We now walk the tree using an inorder traversal, paying attention to precedence. In fact we use a rule that says if we go from an operator with a higher precedence to one with a lower precedence, we’ll output parentheses to surround the subexpression containing the lower precedence operator. If the precedence number is equal or lower, we don’t output any parentheses. Here’s the pseudo code:

string Visit(node, priorPrecedence) {
  if node is number 
    return number.ToString()
  result = Visit(left, node.precedence) +
           node.Operator +
           Visit(right, node.precedence)
  if node.precedence < priorPrecedence
    result = '(' + result + ')'
  return result
}

There are some assumptions here but they’re pretty obvious (for example, there’s some way to distinguish a number node from an operator node, operator nodes have left and right children, and so on).

So, a two-step process, but nothing too difficult once you’re used to the stack-based approach to evaluating an RPN expression. I quite like this idea of reconstructing an expression tree and then traversing it in a different order than before.

Album cover for Stage (2)Now playing:
Sweetback - Round And Round
(from Stage (2))


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

Crazy For You: cartoons for the actors

I’m in a show at the moment at the Fine Arts Center here in Colorado Springs (as it happens, tonight is opening night). We’re doing Crazy For You, a modern musical that marries up lots of great Gershwin tunes with a light 30s style plot. And tap dancing. Lots of tap dancing. Man, am I glad I’m not in those numbers: I get exhausted just watching.

Carzy For You cartoonAnyway, I play a British character (type-casting?) called Eugene Fodor who’s on a trip through the American West with his sister writing a guide book (no, nothing to do with the real Eugene Fodor or the Fodor’s guides, it’s just a joke). At a point in the second act I propose that the assembled company could learn a thing or two from Englishmen: to keep a stiff upper lip. And the company then slips into another wild tap number called Stiff Upper Lip, in which I’ll admit I do participate (probably muttering under my breath ‘step-ball-change’, ‘step-ball-change’). I am not, in any sense of the words, a gifted dancer.

Moving right along...

Last night I discovered that our set designer, Tom Hansen, is a cartoonist. As a present to each actor on preview night, he’d done a cartoon of them. Here’s mine, showing me giving my line with Tom’s recurring kid character listening in.

I’m so going to use that drawing of me. Maybe for the DevExpress newsletters?

Now playing:
Pet Shop Boys - One of the Crowd
(from It's Alright)


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

PCPlus 281: Indexing the Internet

I write a monthly column for PCPlus, a computer news-views-n-reviews magazine in the UK (actually there are 13 issues a year — there’s an Xmas issue as well — so it’s a bit more than monthly). The column is called Theory Workshop and appears in the Make It section of the magazine. When I signed up, my editor and the magazine were gracious enough to allow me to reprint the articles here after say a year or so. What I’ll do is publish the article from a year ago or so here when I purchase the current issue.

PCPlus logoI was in England when the May issue came out, so I’m able to post this a little earlier than usual (my Barnes & Noble generally gets an issue 5-6 weeks after it appears in newsagents in England).

This particular piece was a pure layman’s article about how to index text and in particular how big search engines index web pages. I covered the usual suspects: inverted indexes and PageRank, with asides on stemming and SEO (search engine optimization).

As it happens, in doing the research for this article, I read Sergey Brin & Larry Page’s seminal paper The Anatomy of a Large-Scale Hypertextual Web Search Engine for the first time. This was the paper that essentially launched Google and that changed the landscape of search engines. The techniques discussed in this paper have obviously improved in the 12 years since then (I dare say that Google no longer just uses PageRank but instead use a panoply of different indexing mechanisms to improve results), but it is still an excellent exposition of what happens in a large-scale search engine.

And... 12 years ago? How the internet has changed since Brin and Page presented their paper at the Seventh International World-Wide Web Conference in 1998.

This article first appeared in issue 281, May 2009.

You can download the PDF here.

Album cover for HeligolandNow playing:
Massive Attack - Babel
(from Heligoland)


Share it: Digg It!  StumbleUpon  Reddit  Del.icio.us  NewsVine  Furl  BlinkList  Ma.gnolia  Technorati

About Me

I'm Julian M Bucknall, the M because it's my middle initial and because I and the other Julian Bucknall (the movie guy) would like to differentiate ourselves.

I'm a programmer by trade, an actor by ambition, and an algorithms guy by osmosis. I write articles for PCPlus in my spare time, not that there's much of that.

Julian M Bucknall Apart from that, an ex-pat Brit, atheist, microbrew enthusiast, Pet Shop Boys fanboy, slide rule and HP calculator collector, amateur photographer, Altoids muncher.

DevExpress

I'm Chief Technology Officer at Developer Express, a software company that writes some great controls and tools for .NET and Delphi. I'm responsible for the technology oversight and vision of the company.

The OUT Campaign

The OUT Campaign

Validation

Valid XHTML 1.0 Transitional     Valid CSS!

Bottom swirl

Archives

September 2010 (1)
SMTWTFS
« Aug  
1234
567891011
12131415161718
19202122232425
2627282930

Like this Archive Calendar widget? Download it here.

Search

Google ads

My Tweets

Bottom swirl