Link Dump

phpSNMP: An snmp implementation for PHP written in PHP. I’ve to remember this one, could be handy.

Segway Polo Video: So when will they start Segway Polo leagues? More importantly, when will ESPN start coverage of the new league :-) (via Slashdot).

JpGraph: A graphing library for PHP that uses gd.

CIA World Fact Book: Information on every country in the world.

SCPlugin: Access Subversion from the Finder in Mac OS X (via Simon).

TunesBrowser: Music player for iTunes shares.

Make Magazine: O’Reilly has a new print magazine coming out next year.

Link Dump

Lego Guitar: It is simply amazing what some people are able to do with Legos.

Google IPO Site: Looks like this will be the place to find out info on the pending IPO of Google.

Bloglines Subscriber Stats: Interesting read on the influence one number can have, the number of Bloglines accounts that subscribe to your feed (via Mark Fletcher).

Microsoft.com Using CSS: An article about redesigning Microsoft.com to use CSS. Sure would be nice if someone at MS who had to the power to ‘Make It So’ would read this and have their site update.

Ray G’s Blogroll: That is one insanely cool UI for a web page. Oh how I long for the day when rich webapps will be the norm, not something amazing to gawk at (via Jeremy).

Global Worming: A brief explanation from Google on what happened to them because of MyDoom. Assuming this analysis is truthful and accurate I think this is exactly the sort of thing a corporate blog should be used for.

FreeBSD Jails: An ACM Queue article by Poul-Henning Kamp and Robert Watson on FreeBSD’s jail system.

3Com Support Is Really, Really Bad

Several weeks ago we sent in two 3Com SuperStack 3 3300 24 10/100 Switchs into 3Com for repair. They both had spontaneously died out of the blue with in a few months of each other. Since this product was still covered under the “sort of lifetime” warranty from 3Com we figured that we’d simply send these units in, get them repaired and then put them back into use. Of course when ever you think something should be that easy and straight forward it rarely is. The first unit they fixed and sent back without any problems. After waiting a few more weeks for the second one to show up (we’d sent them both in at the same time) we finally called 3Com wanting to know where our second device was that we’d sent in for repair. We were told that it had arrived physically broken and that wasn’t covered under the warranty. Obviously it was in one piece when it got sent, we’d had insured. Long story short, UPS wasn’t going to cover the broken hardware either because 3Com had thrown away the box the device had been shipped in, which UPS wanted to confirm that the damage was done during shipping.

At this point I’m trying to figure out two things about 3Com’s support. One, why didn’t they call us when they opened up the box and found that one of the devices was in pieces? Two, surely 3Com shipped and receives enough packages each day to know that if something arrives broken then maybe they should hold on to the box to prove it was damaged in shipping.

Fast forward to this morning when a box from 3Com shows up at the office. We figured this would be the (hopefully) fixed second 3Com switch. What we found it the box was truly amazing. It was indeed a 3Com switch, but it wasn’t ours. As matter of fact it wasn’t even the same model as ours. On top of all of this the one they sent us back looks like it has been through a fire and then sent to the bottom of the ocean. I’d never seen a piece of network equipment look so incredibly toasted. So my boss had the honor of calling 3Com to chew them out over the complete uselessness. Once that was done I wanted to make sure we could all look back on this, so I took a few pictures. The thumbnail above a close up of the back expansion port. There are two more of the back, one is head on from the back and the other if from the top side back. The last shot is from the top side front. Notice how black the fan vents are on the side, ouch!

Hey 3Com, don’t expect me to be recommending your equipment if this is the type of service I can expect for products with a “lifetime” warranty. It shouldn’t be noted that their lifetime warranty isn’t really lifetime. The warranty is good up until five years after the product has been discontinued. It would be cheaper for us to simply buy Netgear switches every five years.

How Many News Feeds Do You Follow?

Since I’ve been using Bloglines to keep up with news feeds I’ve noticed that the number of feeds that I’m comfortable following has gone up quite a bit. Today I noticed that I’m now up to 50 51 feeds. Makes me wonder at what point I would have to start scaling back. As it is right now most of the feeds don’t update every day, so if the frequency of updates were to change dramatically I’d likely be unable to keep up at 51.

I wonder what Bloglines account has the most subscriptions?

Link Dump

Google IPO: I think their price range of $108 to $135 is probably double what it should be. A price this high pretty much kills my chances of purchasing their stock. :-(

Technorati Has A New Look: I like the new look much better than the old one. Hmmm, their search feature appears to be dead right now.

O’Reilly Open Source Con This Week: There’s likely to be plenty of coverage of this years con. I just got an announcement for #oscon on freenode.net. There’s also the blog coverage, an official wiki and streaming of the keynote speeches (although I don’t know when July 39th is).

MIT OpenCourseWare: MIT’s operating system course.

Efficient CSS: Some tips on making your CSS compact. Some of the short cuts are bit hard to read in my opinion.

NPR RSS Feeds: Does listening to NPR make me old? (via Jeremy).

Staticize Benchmarks: Load average benchmarks using plain WordPress and WordPress plus the Staticize plugin. Makes use of a little shell script that tries to mimic the Slashdot attack.

Google Page Rank Extension For Firefox: I generally use Safari for most of my browsing, but something like this may be a good reason to start up Firefox more often.

MovableType 3.1 Features: Looks like a couple of features people have been pushing for, like Subcategories.

RSS Scaling Problems

In recently the problem of RSS scaling has been brought up by InfoWorld’s Chad Dickerson, Mark Fletcher of Bloglines and Jeremy Zawodny. If you are into trends the obvious thing to say is something like “can’t we just add in some sort of BitTorrent feature?”. Honestly this was the very first thing that popped into my head too, but it felt like it would introduce too many complicated issues for something that feels like it needs a relatively simple solution. The next thing I thought of was FreeCache.

From what I can tell I believe FreeCache (or something like it) best fits the bill for distributing the RSS load. The aggregators won’t have to understand any new protocols, everything continues to be plain HTTP, only the URLs will change. The changes to the URLs would be easy to for everyone to adapt to, simply add http://freecache.org/ to the start of RSS URLs. Now that I think about this has another huge advantage, aggregator authors could make use of this right now by prepending the previously mentioned URL to the RSS URLs entered by a user. If an aggregator wanted to be really smart it could simply check to see if the RSS URL begins with http://freecache.org/ and if it doesn’t automatically add it to take advantage of FreeCache.

This picture isn’t perfect though, the problem that immediately jumps out at me is the update frequency issue. For RSS feeds that update often caching system might not be able to keep up. If the bulk of the problem is at one single point, like at the top of every hour because of desktop aggregators, even frequently updated RSS feeds would still be able to benefit from caching.

So to answer Chad, Mark and Jeremy’s question about RSS scaling problems I suggest taking a hard look at FreeCache. Even if it isn’t the best solution right now it may still be a good starting point.

Link Dump

Run Linspire: Yikes, someone had too much time on their hands.

FreeBSD X Server Now From X.org: For better or for worse it looks like FreeBSD has made the move X.org for their X server.

Plenty of Star Wars, Episode III: Revenge of the Sith information and Star Wars DVD details.

Blondestar: Good spoof of On*Star (via Jeremy).

OS X Networking Info: It’s amazing (although often unpleasant) what you can learn when you don’t have any choice (via Simon).

Safari Developer FAQ: A couple of handy hints when working with Safari (via Simon).

PostgreSQL rtrim() Strangeness

So I’m sitting here quietly trying to port some old Oracle 7 view definitions to PostgreSQL 7.4.2. The first few were pretty easy, then I ran into views which were using Oracle specific functions, like decode(). After a some searching I come to find out that this functionality is supported in PostgreSQL by the CASE clause. That turned out to be reasonably straight forward, but I still wasn’t getting correct data back from the view in PostgreSQL. So I trimmed the code back until I found the culprit, rtrim. So that you get an idea of what was happening here is some example code that demonstrates the problem:

SELECT
  rpad(
    rtrim(first_name) || ' ' ||
      rtrim(middle_name) || ' ' ||
      rtrim(last_name),
    40
  ) AS name
FROM users
WHERE user_id = 123


This seems innocent enough right? Wrong! For some reason this code was returning NULL even though I knew that there was data in the first_name and last_name columns in the table for that user. I couldn’t find any mention of this anywhere, but when concatenating strings like this, if rtrim is passed a NULL then it NULLS out the whole concatenated string! I don’t know why it does this, but it does. So how do you fix this you might wonder (I did)? One way (I’m hoping there might be other, read easier, ways) is to add a CASE clause checking to see if the value of the column is NULL before passing it to rtrim(). In my example above let us assume that first_name and last_name don’t allow NULL values, but middle_name does (because not everyone has a middle name, or they don’t want other people to know what it is), the resulting code for the CASE solution looks like this:

SELECT
  rpad(
    rtrim(first_name) || ' ' ||
      CASE
        WHEN middle_name IS NULL
        THEN ''
        ELSE rtrim(middle_name)
      END || ' ' ||
    rtrim(last_name),
    40
  ) AS name
FROM users
WHERE user_id = 123


After writing that out the first time I wasn’t sure it would work, I was worried the parser might not like having a CASE clause in the middle of an rpad between concatenated strings. I didn’t have anything to loose so I went ahead and ran it. Worked like a charm, spit back a string for the name even if the middle_name field was NULL. The moral of our story, beware the swinging battle axe that is rtrim()!