Also see the list of articles, none to be taken seriously.

Amazon costume screenshot

This costume on Amazon recently caught my attention. The Deluxe version costs about $35. Upgrading to the Super Deluxe shown here costs an additional $19,975, though the pictures look identical.

Is this merely an error, or a diabolically extreme version of an old pricing strategy to make the Deluxe look like a good deal, lowering sales resistance?

Intentional or not, I’d be curious to see before-and-after sales data for the Deluxe to know whether it worked.

Putting items in the “Save for Later” cart is great for watching Amazon adjust prices: every time you open your shopping cart to buy something else, it details all the changes that have taken place. And most of the prices do change, almost every day. Sometimes the price on a particular item starts to drop steadily, a few dollars a day over several days, until it approximately matches the discounted prices competitors are offering at the time. Then it snaps back to regular price a few days later. Sometimes the motion is more complicated, presumably due to algorithms beyond my ken that adjust the price by pennies at a time.

It must be fun to run a store where you can do this kind of thing as an experiment.

Read and Post Comments

My silly hack, written and presented at Music Hack Day Boston 2010 last weekend.


1. A problem

For an increasing number of us, the same device we use to play music also handles email and GPS directions. Listen with me for a few moments of my drive.

2. A solution: “In 500 feet...”

Let’s throw a ridiculous amount of technology at it!

We analyze the phonemes of the speech and map each syllable to a MIDI note.


We’ll use Yamaha’s Vocaloid speech synthesizer available as part of the Canoris API to sing the GPS directions, overlaying the lyrics.


3. Another problem: “Keep going straight”

So now we’re listening to the Byrds.

As speech technology improves, this could get confusing.


4. Another solution: Musixmatch lyrics lookup

We’ll look for songs that contain “dangerous” phrases, and just not play them.

Python code listing

5. Technique

The current iteration required hand tweaking to get the timing right, but this is the roadmap:

Extract melody from channel 4 of karaoke MIDI file (.kar)

If no MIDI source available, synchronize syllables to Echo Nest beats, and use root of chord for corresponding timestamp from analysis.

In the future, the same technique could be used to change the lyrics for an entire song.

Stay tuned for more information and source code.

Read and Post Comments

Jeff presents Joomla! I present Drupal! The two web site frameworks go head to head at our next meetup this evening.

More info and RSVP form.

Read and Post Comments

Thanks to Noosphere Networks, I’m releasing a script that helps developers of web sites built with Drupal to maintain separate development/test and production sites, pushing changes from test to production as needed. This is challenging with a stock Drupal installation. Changes to PHP code are no problem, because it lives in the filesystem and can be copied or committed to a revision-control system like Subversion. But a lot of Drupal’s configuration work take place within its web administration interface and is saved to the database, where production content such as user accounts and comments is also stored.

The desire to do this frequently comes up on Drupal’s forums, and the typical workarounds have some large drawbacks (involving some combination of extended downtime on the production site, duplication of work, and the loss of content, comments, and user account changes made in the interim).

This small script attempts to solve that by categorizing Drupal’s tables and moving only the right ones at the right time, while handling details such as merging sequence numbers. It also dumps Drupal’s databases to disk in a format that works well for checkin to a revision control system.

This is free software, licensed under the GPL.

Theres a more ambitious project called AutoPilot that aims to do this and more in the future, but its ability to merge test sites into production without losing production content isn’t available yet, and I needed something now.

Be warned, though, that this is an alpha release, intended for those with familiarity with MySQL and Drupal’s table layout. If you have CCK fields, there may be some manual work required when you modify your field layout because CCK tends to change your database schema, and Migraine does not currently attempt to automate all of those changes. It will detect them and warn of the problem, however.

See more information at the Migraine project page.

Read and Post Comments

We have a new location and a guest speaker for our April meetup. Nate Abele of the CakePHP project will be here to show off the rapid web development framework and answer questions. We'll make time for discussion too.

The new location is a really nice conference room at the Johnson & Wales Academic Center, with everything that implies (i.e. a projector).

All programming skill levels welcome. If you're going to be in the Providence, RI area and can make it, please see here for more details and to RSVP:

Providence PHP April Meetup []

Read and Post Comments

Lots of geeky news. I took over officially as organizer of the Providence PHP meetup this month, and our next event is at 729 Hope St on Tuesday, February 6 at 7 PM. So join us for coffee, pastry, a wide-ranging, informal discussion of anything related to programming with PHP, or all three.

This time, we’ll probably share some of the projects we’re working on, so bring some screenshots or a quick demo if you’d like. (If this starts to run long, we can always go into more depth next month.)

Please RSVP.

Read and Post Comments

If your usual lunch crowd doesn’t talk enough about computers for your taste, escape with us to the monthly Providence Web Developers Lunch Hour. (Chris, the usual organizer, won’t be able to make it, so I’m hosting in his place.) Please RSVP here.

Read and Post Comments

fs2svn is a new, free, open-source tool that converts a bunch of archive folders into a Subversion repository.

If you’ve kept a series of historical snapshots of your work in folders, fs2svn can help you upgrade to a full-fledged version control system.

fs2svn goes through all the folders under a given parent folder (in filesystem order) and creates a Subversion revision for each one, backdated to the most recent file’s last modified date. The log message is set to the folder name.

Additions, changes, and deletions between one folder and the next are all recorded in the repository.

The input format is very simple. It only covers the mainline trunk, not any tags or branches (though tags for major versions could be manually created later, if your folder names carry enough information).

The format is so simple it could be used as a common intermediary. If you wanted to migrate a mainline trunk from some exotic version control system to Subversion, you could write a script to export it to regular folders, then use this script to import the result into Subversion.

See the main fs2svn page for information, examples, and to download.

Read and Post Comments

I had a problem where my scripted FTP uploads through ftplib in Python 2.3 would experience long (6 or 7-second) delays before transferring each file. Other FTP programs were fine, except for a similar delay on connect. It turned out to be an interaction with ftplib’s IPv6 support in Python 2.3 and the Mac OS X name resolver, and it finally appears to be fixed in the recently-released Mac OS X 10.3.8, which noted speed improvements in certain network applications.

In case the delay bites anyone else (or in case it’s not really fixed, and some other network change is just fooling me) here’s the workaround I’ve been using until now.

With IPv6 support in Python 2.3 / Mac OS X 10.3, ftplib’s ntransfer function now calls getaddrinfo for every single file tranferred, and the name resolver does a slow timeout each time. Making a local copy of ftplib and replacing the call to getaddrinfo with constants may be ugly, but it worked around the problem.

Original line (multi-second delay), at line 233:

af, socktype, proto, canon, sa = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM)[0]

Changed line (assumes IPv4 addresses):

af, socktype, proto, canon, sa = (2, 1, 6, '', (host, port))

This change speeds up multi-file FTP transfers immensely (at least to my FTP server) under Mac OS X 10.3.0 through 10.3.7, but early results indicate it’s not necessary on 10.3.8.

Read and Post Comments

Why does Windows still suck?

The most surprising figure in the article—that 91% of PCs are infected (or maybe the word should be “infested”)—sounds high, but gets some anecdotal support in comments in Brent Simmons’ weblog.

Read and Post Comments

Next Page »