Article posted on Nov 27
I'm currently in the process of upgrading our phone systems at work. In the Reno and Salt Lake City offices, we had a Cisco Unified Communications VoIP system going back to 2001, with Cisco 7900 series phones. The 7900s used SCCP, a proprietary but decently understood protocol to talk with the call managers. Earlier this year, the call managers died. We had been preparing for this possibility, and had an Asterisk system ready that was able to talk SCCP to the 7900 phones. Unfortunately, the SCCP driver is graciously described as "beta" (remember, it's a proprietary protocol). Everything mostly worked, but we lost the ability to do 3-way conferencing via the phones. So now we're replacing them with Cisco SPA504G phones, which use the industry standard SIP protocol.
In the last few weeks/months, I've been preparing to make this process as smooth as possible from a user perspective, since this is the most visible aspect to the employees. One of the features of the 7900 phones is a separate tone when reaching an outside line. When you pick up the phone, you hear a standard North American dial tone (350 + 440 Hz). When you press 9, however, that changes to a different dial tone, to signal that you are "outside" and can dial as if you were at a regular POTS phone. Here is a sample audio file of that process. I always found the order to be backwards; I figured the "inside" dial tone should be non-standard, and once you hit 9, you'd be presented with a standard North American dial tone. Oh well.
The SPA504G can be programmed to generate an outside dial tone, but it defaulted to a single 440 Hz tone, which just did not sound right. It's customizable, so I started looking for what DTMF combination the 7900's outside dial tone is. I didn't find anything online, and while many of the tones on the 7900s are sent to the phone by the call manager, the outside dial tone is hard-coded in the phone's firmware. I could have probably figured it out if I had an oscilloscope, but I didn't have access to one. Random fiddling came close, but it still sounded off.
Through some reading, I eventually figured out that "special tone frequencies" are always in multiples of 40, 50 and 90 Hz. This apparently makes it easier to determine what two tones are being sent in a DTMF sequence. A dial tone is 350 + 440 Hz (90 Hz difference), a ringing tone is 440 + 480 Hz (40 Hz difference), and a busy signal is 480 + 620 Hz (90 + 50 Hz difference). With that, I was able to narrow down the possibilities, and came up with 440 + 530 Hz for Cisco's outside dial tone. The low tone is 90 Hz higher than the 350 Hz low tone of the dial tone, and the high tone is 90 Hz higher than the low tone.
If you happen to be in my same situation (or if you just want to use an outside dial tone that sounds better than that stupid single 440 Hz outside dial tone that the SPA504G defaults to), go to Admin, Advanced, Regional, Call Progress Tones, Outside Dial Tone, and use this:
440@-19,530@-19;10(*/0/1+2)
Note that to actually get the phone to play an outside dial tone, you must configure your dial plan to support it. That means that after every 9, enter a comma. Here's my current dial plan:
(3xxx|*22xx|*23xx[0-9*#].|*2x|*3xxx|9,11|9,911|[346]11|0|9,[2-9]xxxxxx|9,1[2-9]xx[2-9]xxxxxx|9,011xx[0-9*#].)
Note that all leading 9s need to have a comma after for this to work. See, for example, 9,11|9,911. The user can still either dial 911 or 9911 in an emergency, it's just the outside dial tone will play after the first 9.
By the way, for that example wav file I showed above, I had considered recording the actual sound coming from the phones with a microphone, but I decided to do it all in Audacity instead. That's right, it was completely computer-generated. All I had to do was use Audacity's tone generator on separate channels (for example, one channel with a 350 Hz tone and one channel with a 440Hz tone for the regular dial tone), and then combine everything down into a single mono channel.
Article posted on Nov 16
I signed up for a Second Life account a few years ago, but I rarely used it. It really wasn't that fun for me. Later, I learned that simply being in Second Life wasn't the fun part; it was creating and building that was interesting. However, building anything lasting required a premium account ($9.95 per month), which "entitles" you to buy 512m2 of land via the in-world economy. So last December, I bought some land.
It was quite a steal, as far as in-world land goes. I paid L$8500 (approx. $34) for a 1536m2 plot at the edge of a sloping green hill region, overlooking a "protected" beach region. (Protected means nobody can actually buy the land, it simply remains empty.) The view was excellent. The seller had literally just put the land up for sale, and I had just happened to find it via the land sale search when he did. This is the sort of land that could easily go for double that.
I started working away, building objects and sometimes buying others. At first I just was doing random things with the land, but I later decided to build the Finnix Information Center. (More information about that is available in this Finnix blog post.)
At one point, the land immediately south of my land went up for sale, at L$10000 ($40) for 1024m2. I bought it, not knowing what I'd do with it, but it was still a good deal. I set it for sale at L$30000 ($120) in case anyone really, really wanted it, but in the meantime, I just used the area for various projects. But about 2 months later, someone bought it! I made a quick buck.
Keep those numbers in mind: L$30000 for 1024m2. That was fairly typical of the area. Just like in real life, in-world land is driven by mostly aesthetic factors. Is the area cluttered? Do the neighbors have big fences butting up against your property? Good neighborhood? What's the terrain like? Grass or rocky? This area was one of the best areas you could get. It was on a small slope, and had an unobstructed easterly view of a protected region on the beach. The only way you could do better was to find land directly on the beach.
Well, one day, Linden Labs decided to un-protect that region and sell it off to developers. Literally overnight, a strip mall moved in next door and blocked my view of the beach. At this point, I had started losing interest in Second Life again, so having "just another plot of land" wasn't worth me maintaining. As a great leader once said, "It's been swell, but the swelling's gone down."
Eventually, I dismantled the Finnix Information Center. I wanted to sell the land, so I started looking at other land for sale in the area, and it was pretty dismal. I ended up selling 1024m2 of the 1536m2 directly to a neighbor (it filled in the square of her land, making it 4096m2) for L$4000 ($16). For the other 512m2, I put it up for L$2500.
It sat there for months.
I logged in tonight, saw that it had not been sold, and then thought, "Wait a minute. I'm paying $10 per month to try to sell this land for $10!" I went on land sale search, saw that the cheapest 512m2 plot was L$800, and set mine to L$786 ($3.14). It was sold within 3 minutes. By a guy who immediately put it up for sale for L$940 ($3.76).
So that's it. I bought 1536m2 for L$8500 and sold it for L$4786. That's pretty dismal, considering at its height, I sold the equivalent of 1536m2 for L$45000. Now, part of it is the economy, both real-life and in-world. I've noticed that items like clothing seem to sell for about the same types of prices they sold for a year ago, but the in-world land market seems to have collapsed. Here's my working guess: That 1536m2 plot of land may only cost L$5000, which is $20 of your real-world money, but it then costs $18 per month in the form of land use fees. ($10 per month is basic premium access with 512m2 of land use rights, but everything above that amount of land costs extra monthly fees. An extra 1024m2 is an extra $8 per month.)
So it costs a decent chunk of change just to continue owning land. $18 may not have been much a year ago, but you may be tighter for money now. However, items like clothing don't have to live anywhere. They're either on you, or stored in your inventory. So you don't need to own land to buy and use clothing, so you don't need a premium membership. Therefore, the price of in-world clothing has remained pretty stable, while the price of land has crashed.
It's funny how closely the in-world land market is mimicking the real-world housing market. Fly around Second Life and you'll see a LOT of land available, most of it very cheap. But just like how I can't buy a house in the real world now -- even though I'd love to and it's a buyer's market -- there's not a lot of interest in in-world land ownership because of how much it cost to keep that land. And just like how there are many foreclosed homes in the real world, there is a lot of abandoned land in-world. Land is usually abandoned when a user stops paying for their account without first selling off their land. Eventually Linden Labs will take this land and sell it at auction, much like a real-world bank.
That's Second Life economics on a macro scale. As for my personal situation, I blame the strip mall.
Anyway, I went into my account and set it back to the Free account type. I'm still playing with building in-world, but these days I'm on OSGrid. It's a Second-Life compatible grid that uses OpenSimulator, and the land is free, since you're running your own OpenSim server. Come on by! The region name is "Undef Lagoon" on OSGrid.
Article posted on Nov 8
Most of the dishes I've presented here have turned out well. However, I thought I'd document a dish that didn't work out the best, but still has potential for improvement. A culinary beta, as it were.
A discussion about "sausage rolls" started in IRC this evening. Sausage rolls are pretty simple, just sausage and seasonings inside a dough wrapper, and are popular in the UK, Ireland and Australia. I decided to try my hand at a variation, as a single sausage loaf, designed to be cut into slices and served.
I took a tube of crescent rolls, but instead of pulling them apart into triangles, I left the sheet of dough intact. I then spread a pound of Jimmy Dean "sage sausage" (you can use regular sausage, with some sage rubbed into it) over the dough, leaving some room on the sides and top. I then rolled the dough and sausage into itself, much like a cinnamon roll. Crimp the top and ends, patch up any exposed areas of dough, and put into a 350 degree oven for 30 minutes. I always leave a baking stone inside my oven, and put the mega-roll directly on the stone.
This was the result. I pulled the loaf after 25 minutes, and you can tell it was still a little pink in the middle. But another 5 minutes in the oven cooked it all the way through. I really liked the flaky outer crust, but the inner dough pooled in the middle, and was... well, doughy. It wasn't the consistency I was expecting.
It was certainly edible, but next time I'll make a few changes. Namely, instead of one rolled loaf using the entire sheet of crescent roll dough, I'll split into 4 quarters, still leaving the diagonal perforations connected. That way there is no inner dough, and the result will be a more consistent baking experience. But again, overall I liked the idea of using crescent roll dough, and baking directly on a baking stone turned out well.
Article posted on Nov 7
If you downloaded Red Hat Linux 9 from BitTorrent in April 2003, you probably (partly) have me to thank.
In 2002, I helped build a pair of datacenters in Reno, NV and Raleigh, NC. They were technologically wonderful, built to the same standards as Exodus datacenters. Lots of bandwidth, redundancy everywhere, futuristic security. One of the design principles was that we could take a potential client into a node room and say, "pull any two cables you'd like". With limited exception (downlink Ethernet to individual clients was only single redundancy) we succeeded, but never actually got to show that off. They were great datacenters, but we could barely sell anything, and they mostly went unused until the company's demise in 2004.
So we had massive amounts of bandwidth (by 2002 standards; two 155Mbps OC3s and a 45Mbps DS3 per site, provisioned from an OC12 that could effectively double the bandwidth in the future), and only a dozen clients, if that. I set up a mirror of as many Open Source projects as I could find, but that only ate up about 20Mbps on average.
On March 31, 2003, Red Hat Linux 9 was released. This was the first Red Hat product to be officially offered via BitTorrent. BitTorrent had been released about a year earlier, and was just starting to gain traction. RHL9 was arguably the first major worldwide test of a major software release. So hey, I had all this bandwidth, and there were thousands upon thousands of people downloading RHL9 through BitTorrent. I threw up a seed machine in the Reno datacenter, and watched the slurping begin.
Unfortunately, the official BitTorrent client could only seem to push about 50Mbps of torrent traffic before hitting a wall. So I added another server. And another. And another. And then 4 in Raleigh. All told, I was pushing 400Mbps of traffic across 8 machines and two datacenters into the mesh, and was often seeding at least half of the traffic of that single torrent. I believe that lasted for 3 or 4 weeks.
The company went out of business in 2004 (for non-BitTorrent-related reasons of course), and I was later hired by the company responsible for maintaining and eventually turning down the Reno datacenter. We had our network (and the remaining clients) migrated out of the datacenter by the middle of December, but due to a dispute with the eventual purchaser of the datacenter space, I was told to keep the datacenter "operational" through December 31, 2004. To do so, I left one Linux server running, connected to the only remaining transit (an OC3), and routed our remaining IP space to it, a /20. An entire /20.
So for 2 weeks at the end of 2004, I had a single server, sitting in the middle of a 50,000 square foot world-class datacenter, with a dedicated OC3 running directly to it, and 4096 IPs at my disposal. I actually can't remember what I ended up doing with it, except for putting up a web server with a test page that responded to all IPs. I'm sure it was more profound than that.
(In case you're wondering, Linux, at that time, did NOT like having 4096 sub-interfaces. They would all eventually work, but bootup would take at least 10 minutes. It seemed adding each new interface introduced a higher non-linear delay.)