Observations on PS3 Pricing

I just noticed something odd in the price of different Playstation 3 models: Amazon.com’s PS3 page has:

Playstation 3, 120 Gb: $299.99

Playstation 3, 250 Gb: $414.99

From this, we can work out the price per gigabyte: ($414.99 – $299.99) / (250 – 120) = $0.8846 $/Gb.

That’s not the odd part. Since I have some old Playstation 2 games, ideally I’d like a PS3 that’s backward-compatible with the PS2. According to Wikipedia (which can be relied on, here, since it’s a nerd topic), those are the 20 and 60 Gb models, as well as some 80 Gb ones.

Again from Amazon, we have:

Playstation 3, 20 Gb: $229.99

Since this has 100 Gb less than the 120 Gb model, we would expect it to cost 100 × $0.8846 less, or $211.53. But it costs $229.99, or $18.46 more. So that $18.46 must be the price of PS2 compatibility.

Now we get to the odd part:

Playstation 3, 60 Gb: $849.99

We would expect this to cost $299.99 (the price of a 120 Gb model), minus 60 × $0.8846 = $53.08 because it has 60 Gb less storage, plus $18.46 for PS2 copmatibility, for a total of $265.37. So why is the real cost over $500 higher?

All I can figure is that the 60 Gb disk is a lot bigger than a 20 Gb disk, leaving less free space inside the case. So the PS2 compatibility has to be built out of smaller components, which are vastly more expensive.

Network Problems Fixed?

As far as I can tell, FreeBSD 8 tickled something in the driver for my ethernet card, and caused it to behave unreliably. Rather than muck around with half-tested kernel patches or ifconfig settings, I slapped a $30 Whatevertheyhadontheshelf-3000 (read: common chipset that’s been debugged by a lot of people), and as far as I can tell, things are now working as they should. If the site stays up for a year, I guess we’ll know.

I also took the opportunity to add some memory. So whoo-hoo all around.

And while I’m at it, I should point out that FreeBSD is like a VW Bug: not the prettiest thing to look at, especially compared to various Apple or Linux offerings, but in a crunch it’s nigh-indestructible. Wanna run with a root partition that’s over 100% full? Sure thing. Boot a 7.2 kernel with a 8.0 /usr? No problem.

Geek T-Shirt

I just had an idea for a geeky T-shirt:

In just seven days…

TTTCGCATTCTGGGATTCTCTAGAGCCATCTTGCGCCTCTGATCGCGAGACCACACGATGAATGCGTTCA
TGGGTCGCTTCACTCTATCCTGGACGTTGCCTTTACTGTTTTCTCCCGTTTCACACTGATACTTAGAGTT
ACAGCTTTCAGTGCAAAGGAAGGAAGAGCTTCTCCGGAG

SRY protein

… I can make you a man!

(For those who haven’t memorized the human genome, that’s the SRY gene, which is found on the Y chromosome and makes embryos develop as males.)

(Well, mostly.)

Google Criticized Over Name of Its New Language

Slashdot has a story entitled Google Under Fire For Calling Their Language “Go”.

I can certainly understand that: Go has got to be the least-googlable language name since C.

Happy Mole Day

As the Tree Lobsters remind us, today is Mole Day (the official site seems to be overloaded, but tehPedia isn’t). Yay!

For those who have forgotten High School chemistry, “mole” a word like “pair” or “dozen” or “score”, in that it refers to a certain number of things. But while “a dozen doughnuts” means twelve doughnuts, “a mole of doughnuts” refers to 6.02×1023 doughnuts (and, of course, a baker’s mole means 602,000,000,000,000,000,000,001 doughnuts).

6.02×1023 is known as Avogadro’s number (which is why you should celebrate Mole Day by having guacamole at lunch), which has the interesting property that that many hydrogen atoms weigh one gram. Oxygen, with 8 protons and 8 neutrons, has an atomic mass of 16 (minus some change), so a mole of oxygen weighs 16 grams.

This makes life easier for chemists. We all know that two hydrogen atoms and one oxygen atom combine to make one water molecule. And likewise, two dozen hydrogens and one dozen oxygens make a dozen water molecules. So two moles of hydrogen and a mole of oxygen make a mole of water.

So naturally, Mole Day is celebrated starting at 6:02 on 10/23 (US notation. Check with your local chemist and setting of $LC_TIME to find out when it’s celebrated in your area.

Update, Oct. 25: Alert reader Anne Wright pointed out a mistake. Fixed.

Quick and Dirty Perl Hack: Is Foo::Bar Installed?

Every so often, I need to find out whether I have a certain Perl module installed. Usually it’s either because of a security alert, or because I’m wondering how much of a pain it would be to install some package that has Some::Obscure::Module as a prerequisite.

I don’t know how y’all do it, what with the plethora of package-management utilities out there, but one way that works for sure is simply:

perl -MSome::Module -e ''

If this command succeeds, that means Perl successfully loaded Some::Module, then executed the (empty) script, printing nothing. If Some::Module is missing, it’ll print an error message and fail.

This is short enough that it should be aliased, but I haven’t gotten around to that yet.

It’s A Visual Pune, or Play on Dots

(Whipped up in 10 minutes with the Gimp, so don’t complain about the quality.)

Taxon Bingo

Okay, so I’m a geek. When I saw a story in the
Washington Post Maryland
RSS feed with the headline
“Chesapeake Beach Can’t Raise Taxon Bingo Machines”

RSS Headline

I wondered what
Taxon
Bingo would look like, and had to whip this up:

Taxon bingo card

(The headline has been fixed in
the full article,
but remains in the RSS feed.

Original image from
Wikimedia Commons.)

iReligion 2.0

The Telegraph
reports that

Cardinal Sean Brady, the leader of Ireland’s Roman Catholics, has urged social network users to start sending daily prayers by text, Twitter or e-mail.

This, of course, could be the start of something huge: if tweeted
prayers are as good as spoken ones (contest for the comments section:
condense the Lord’s Prayer into 140 characters), then the sky’s the
limit.

Imagine: you add a dinner date on your PDA. When it gets added to your
calendar server, it sends a request to the Catholic church’s server,
with the XML equivalent of “forgive me, father, for I have committed
gluttony”. The church’s expert system analyzes this request behind the
scenes, and responds with something like “say five Hail Marys”
(properly encapsulated in XML, of course). Your home computer then
schedules a time to tweet five Hail Marys while you sleep.

At MyVatican, you can view your history confession, schedule
preemptive penance, friend saints and other intercessors, buy relics
at the online shop, and follow your favorite priests as they get
shuffled from one parish to the next.

What would be really cool would be if they wikified the
Catholic Encyclopedia.
Though I assume that [citation needed] would be
replaced by [must be taken on faith].

Just A Little Bit of Planning

One thing I’ve noticed about my code is that an awful lot of the
comments are of the form

call_some_function();
	// XXX - Error-checking

(where
XXX
is an easily-grepped
marker for something that needs to be fixed.)

The proximate reason for this accumulation of “do something smart if
something goes wrong to-do items is that a lot of the time, the
function in which this appears doesn’t have a mechanism for reporting
errors, so I don’t know what to do if I detected a run-time error.

This leads to the other big problem, the one where I’m calling another
function of mine, which doesn’t report errors, so I can’t even tell if
something went wrong.

So if a() calls b() which calls
c(), all three are likely to have
XXX - Error-checking
comments; but c() doesn’t know what to do in case of en
error, and b() and a() don’t even know how
to detect errors. And so the XXX comments accumulate.

For me, this is often caused by the fact that experimental programming
and production programming are quite different: when I’m learning a
new system, such as a new graphics or math library, I want to figure
out which functions I’m supposed to call to get the results I want,
what the various data structures do, which one of multiple approaches
to the problem works best, and so forth.

If I set up a test environment (e.g., a database server so I can play
around with database-manipulation code), I’ll be keeping an eye on it
to make sure that everything is sane, so my experimental code needn’t
worry about checking whether the server is up. And if it can’t make a
connection, it’ll likely dump core; but since I don’t have any
precious data or users who’ll yell at me if things go wrong, it
doesn’t matter. It’s best to just set up a working environment and
hammer at the code until it works. I tend to accumulate a large number
of ad hoc modules, functions, data files with names like
foo, bar, foo2, and so forth.

In production, of course, this isn’t good enough: all sorts of things
can go wrong: servers go down, network connections get broken, runaway
processes suck up all available memory, users try to open nonexistent
files, viruses try to overflow buffers, and so forth. Code needs not
only to detect errors, but deal with them as gracefully as possible.

But if I’m working on a larger project, and working on adding new
functionality that I’m not familar with, the temptation is strong to
take the “learning” code that’s been hammered into some kind of shape,
and plop it in the middle of existing production code.

Neither approach is inherently wrong. Each is appropriate in certain
contexts. You want to keep things loose and fluid and unstructured
while learning, because by definition you don’t know what’s going and
what’s best. And you want to have things organized, structured, and
regimented in production, to make it easier to avoid and find bugs, to
ensure code quality and stability.

But this difference does mean that it can be hard to integrate new
code into production code.

Often, test code is so messy that there’s really no choice but to do a
complete rewrite. Neater test code is worse in this regard, since it
may trick you into thinking that with just a little bit of cleaning
up, you can use it in production.

So it’s important, when moving from test to production code, to ask
oneself how errors should be reported. This takes a bit more planning
ahead of time, but like security, it’s easier to build it in from the
start than to retrofit it onto existing code.

The thing that works for me is:

  1. Think of a function to add.
  2. Write a comment describing the function: what it does, which
    arguments it takes, what value(s) it returns, and what it does in case
    of error.
  3. Write the function.

In that order.

This may be more structured than you want in the playing-around phase,
in which case you should definitely consider using it during the
hammering-into-shape phase, after you have the basic functionality
working, and before you’ve started moving test code into production.
Over time, though, this kind of forethought may become automatic
enough that it doesn’t get much in the way of experimentation.