Thursday, October 08, 2009

Wednesday, September 30, 2009

Saturday, August 15, 2009

Pinboard.in - the second coming of del.icio.us?

I used to love del.icio.us. Then Yahoo bought it and turned it into delicious.com. While the new version has some good features, I overall find it too slow and bogged down in fancy, unnecessary ornation. In many ways, I prefer the sparseness of the old design.

Pinboard was recently announced as the cure for such problems. Joshua Schachter (creator of del.icio.us) seems to be an unofficial, in-the-background consultant on this project. He posts on the Pinboard Google group.

One neat new feature that Pinboard has is a quick bookmark-this-without-tagging option which automatically puts things in a special, private "to read" pile. This is intended to work much like the Instapaper model.

The last essential piece of a bookmarking archive is automatically saving the HTML and other contents of a bookmarked page, preserving a locally cached copy for all time. The Pinboard developer is promising this in the future, for a fee.

There is a sign-up fee of ~$5. I paid it because, after seeing bookmarking site after bookmarking site go under or decay, I want to believe that one can be done right. I want to like bookmarking again. For now, I do.

Saturday, August 08, 2009

Life! Don't talk to me about life!

>ask Marvin about the object of the game

"Being clever doesn't always make you happy, you know. Look at me, brain the size of a planet, how many points do you think I've got? Minus thirty zillion at the last count."

The amazing Douglas Adams/Infocom collaboration, the Hitchhiker's Guide to the Galaxy text adventure game, is playable online in Java or Flash (with added illustrations).




Marvin was so popular at one point that he recorded and released a few songs (more details on Wikipedia... definitely check them out if you get the chance), and there was even a Marvin Depreciation Society.





There is apparently going to be a sixth book in the Hitchhiker's series, written by the guy who writes those Artemis Fowl books. It's going to be called: And Another Thing... [All of the titles for the five books in the Hitchhikers' Guide series were phrases that appeared somewhere in the first book. I was hoping that any sixth book would be called "Oh no, not again" (which was what the bowl of petunias thought when it was brought into existence over Magrathea before crashing into the planet).] The book releases on October 12th, 2009. According to the Amazon page: "It features a pantheon of unemployed gods, everyone's favorite renegade Galactic President, a lovestruck green alien, an irritating computer, and at least one very large slab of cheese. " And Arthur and Marvin will be back!

Upgrading the Bayesian-filtered status reader

In a previous post, I described my assembly of a command-line program for Bayesian filtering and presentation of Facebook statuses. After a while, constantly pulling down the RSS feed (via curl) and seeing the same statuses for certain people, day after day until they expired, kind of wore on me, so I went looking for a simple feed reader. There were command-line feed readers that looked more appealing to me (Canto and Newsbeuter) but they required newer versions of Python or some series of installations of things that were not available in a sufficiently upgraded form in Fink. So I tried rawdog which is written in Python and only requires the easily installed feedparser. It seemed like it was modifiable to do what I wanted, and I even went so far as to post a triumphant blog post about my success with getting it to properly parse my Facebook feed and deliver it to my Bayesian-filtering/displaying script. And then the next day, it went haywire and started reshowing me things I had already seen and dismissed.

So.

I decided to do everything myself. I was already partially parsing the RSS feed, so I just went a little further and parsed out the post date and compared it with the date when I last looked through the posts. (This seemed daunting until I found out that Perl already has time functions built in.) Finally I coded in dumping the output to a text file, as well as to the screen. Now the command can work on its own or have its output easily combined with my separate Twitter Bayesian filter which is a bit more sophisticated and which does a nice job of increasing my local Twitter signal-to-noise ratio. I intend to post about it someday.

The code for stati.pl is here.

Thursday, July 30, 2009

The Hardest Logic Puzzle Ever

The Hardest Logic Puzzle Ever came up recently in a Metafilter post, but it linked to a site that gave a very poor explanation of the puzzle and no credit to the original author, Raymond Smullyan (creator of the logic puzzles involving people who always tell the truth and people who always lie).

George Boolos wrote up a nice description of the Hardest Logic Puzzle Ever, including clarifications and breaking the puzzle down into more manageable sub-puzzles. The puzzle goes a step beyond the liars and truthtellers by introducing a third entity: someone who just gives random responses. And they all speak in some completely foreign language. If you solve the whole thing, you can claim that you solved the Hardest Logic Puzzle Ever! It is a bit of a project and benefits from contemplation. It's one of my more memorable puzzle experiences.

George Boolos also once gave a short talk on Gödel's second incompleteness theorem, using only one-syllable words. The text is available here in PDF.

And Smullyan does more than just make puzzles! He is a professor of philosophy at Indiana University and has done important work on extending the applicability of Gödel's incompleteness theorems.

Tuesday, July 07, 2009

How I found Ian Shoales

I remember sitting in a parking lot, waiting for some unrelated event, listening to this little snippet of audio over and over, trying to extract enough of the words that I could figure out what to Google to determine the source. The guy was talking really fast and the other stuff on the cassette seemed to be taped off of the radio... Was it a radio program? The words could have been ungooglable.

I had found this cassette in a box with a bunch of discarded tapes and CDs, left behind by whoever had previously been working in my room. None of it was as tantalizing as this.

It featured someone named Ian in an office fencing with his secretary and spouting diatribes and sardonic top-ten lists before being accosted surreally by an inflating fat man satirizing the stereotypical James Bond (or Dashiell Hammett) villain, complete with henchmen.

I googled my transcriptions and came up with nothing. Then I tried [ian radio monologue -laura] on Google Groups, which turned up a reference to an Ian Shoales and Duck's Breath Mystery Theatre on NPR.

Ian Shoales: Think of him as kind of like Oscar the Grouch, only less muppety and on speed. He is a parody of a critic. Not unlike Stephen Colbert.

He has a web site and his alter ego, Merle Kessler, regularly posts to a blog.

Here is one of his self-introductions:
Hi, I'm Ian Shoales, the-semi-eminent, acerbic social critic. Perhaps you've heard of me. Perhaps you've noticed my hardhitting commentaries on "All Things Considered" and "Nightline," or in USA Today? My trademark, "I gotta go"? That Ian Shoales? Is my name a word in your household? When you see the crossword puzzle clue "bitter, negative, cynical," do you write "Shoalesian" in the boxes, whether it fits or not? I know I do.
Ian on the concept of the state lottery: "Luck gets a bureaucracy."

"I don't like people who speak French in public places. This includes the French."

Ian Shoales on ... himself again:
I admit it freely -- I'm not a positive thinker. On Star Trek, the beautiful alien with the green hair and the taut belly would always say to Captain Kirk, "Oh one called Jim, what is this thing you call a kiss?" If that alien were here today (and in my Perfect World, believe me, she would be), she would gaze at me lovingly and say, "Oh one called Ian, what is this thing you call a sneer?" That's the kind of guy I am. Captain Kirk and I both want the same thing: the whole-hearted devotion of a naive alien. And if certain things stand in our way -- Klingons for Kirk, reality for me -- well, we just have to suck in our guts, set the phasers on Stun, and hope for the best.
Ian Shoales on Twitter:
Posts traditionally have been things like "I'm drinking coffee!" or "A bird flew by!" or "I just shot my parents!". These posts are called tweets. Users of Twitter call each other Tweeple. And haters of Twitter are called Twaitors. It's all a little too *smurfish* for me.
Ian can be heard on KQED (which fortunately has streaming audio), Saturdays and Sundays at around 5:35am.

Saturday, June 27, 2009

Custom Iron-on Decals for T-shirts (or Whatever)

If you have an iron and an inkjet printer, you can make your own iron-on decals. The thermal transfer paper runs about $1 per sheet. This one is supposed to be one of the best.

The easiest way to do this is to use white fabric. Then you can simply scale the picture you want to print and take the mirror image (if getting the orientation correct matters for your image) and print it onto the special thermal transfer paper. Then you press the paper onto the fabric (pre-ironed, so it's smooth) with a hot iron (though not against an ironing board, because an ironing board is soft and the transfer will become distorted... one needs a hard, flat surface).

It's really not that difficult, and making something like this gives a feeling of satisfaction. My first test is shown here. My plan is to custom-design a T-shirt. Maybe with discreet logos on the sleeves.



If you need ideas for designs, check out some of the cool shirts at Topatoco:






Wednesday, June 17, 2009

Synthesizing a word for a set of zero

I felt like making up a word for when you have zero of something. Like if three is a triple, and two is a double, then one is a single, but what is zero?

There's a good generic term for such a word: a tuple. For n=4 and above, all the tuples end in "-uple" (quandruple, quintuple, sextuple,...). Maybe they should be called the "uples". And Wikipedia has an entry for n=0. It looks like this:
0: Empty tuple; Unit
I don't like it much. Since all the other prefixes come from some variant of the Latin word for the number, I decided to start with the Latin word for zero. Of course, the Romans didn't have a symbol for zero. Some hold that the Babylonians were the first to come up with one and that this idea propagated around and eventually the Latin alphabet picked up words for zero in the Middle Ages: cifra and zephyrum. (The English cognate would be cipher.) Therefore, I propose zephle as the zero-tuple. Or else zerple. "Zephle" is probably a more genunine fake tuple, but "zerple" (pronounced as ZEER-pul) is more self-explanatory and fun to say. Zerpledecker bus. Zerple cheesburger. Zerple date. Identical zerplets. See?

Word most likely to be confused for zero-tuple: nonuple. It's when you have nine of something. There's a really long list of such words here.

Saturday, June 06, 2009

Automated self-monitoring

Looking for a way to self-monitor my working habits, I decided to write a script to analyze my notebook file and determine on which dates I had made an entry. Ideally, I ought to be working and making notes on my progress every day.

I decided to grep through the file for datestamps and form something like an ASCII sparkline, indicating whether I had made at least one entry on a given day.

The output for the last couple of months looks like this:
.|.|...|......|...|...||.|..||||....||........|..|..|||.

It looks even more badass displayed on my desktop via Geektool. I am also displaying the actual number of entries for each day immediately below the corresponding sparkline symbol. Admittedly, this contradicts the idea of displaying the information in tiny graphical form. I may eventually switch to something like this:
.|.-...:......-...-...--.:..-::-....::........-..-..---.


This is almost like Benjamin Franklin's system for reinforcing his 13 virtues. Admittedly, I am only reinforcing one virtue now, but I have a few other habits that I have been monitoring with my all-purpose tracking script, and these are ripe for display and correlation with other behaviors.

Friday, June 05, 2009

My 1mm-thick PDA backup system

You may have heard of the "Hipster PDA". It started as a joke that a bunch of notecards could be used like a PDA without all the electricity and technology. Then it caught on. There are elements of this that I like (particularly the creativity and do-it-yourself-ness), but it wasn't what I wanted.

The problem that motivated me: Every once in a while my PDA runs out of charge and/or loses all its data. As everything is backed up on my laptop, this is mainly just inconvenient. But when I suddenly need some vital bit of information that is on said PDA, it suddenly shifts to serious nuisance.

My first solution was to simply print out my calendar (which I keep in the plain text remind format) in 4-up form, fold it up, and keep it in my back pocket. And I found that I liked this because it is often easier to pull out and immediately access the information that I want. (It is particularly useful when going on a trip and having flights, times, hotels, and rental car places all listed on a little rectangle of paper.)

This eventually developed into a full script. This script currently collects the following things into a single text file. 0) The current date, to ensure freshness. 1) The output of my remind calendar, excluding boring things. 2) A little address book. I started by extracting specific contact information for specific people from the OS X Address Book via a little command line program called contacts. Then I wised up and started extracting everyone who has an asterisk after their name, allowing me to easily switch people in and out of my short list. (This is something I would like to automate someday.) 3) Some things that I have hard-coded into the program, including public transportation information, phone numbers for taxis, directions to places that I rarely go to, and business hours for a few places. 4) A tiny calendar. I initially thought of setting this up to grab the last, current, and next months from the UNIX cal program, but then I thought of the ingenious thumb calendar which allows a bunch of months to be compactly fit into a small area. And I realized that I could make my own. 5) And finally, my shopping list as extracted from my todo.txt to-do list.

[The only thing that I would like to get on there that I haven't figure out yet is a ruler, along the edge. This will likely require monkeying with PostScript or something.]

Here's the pared down script:

#!/usr/bin/perl -w

$fname="/Users/Surly/remind.txt";
open(INFO,$fname);
@lines = ;
close(INFO);
$outfile="hpda.txt";

open(OUTFO, ">$outfile");

$datestamp=`/bin/date "+%y%m%d"`;
print OUTFO $datestamp;


$i=0;
while($lines[$i])#assuming we initially have a numbered subtitle
{ $rem=(($lines[$i]=~/^rem/)|($lines[$i]=~/^REM/));
$pass=((($lines[$i]!~/^[;#\n]/)&$rem)&($lines[$i]!~/growlnotify/));
$pass=$pass & ($lines[$i]!~/boring/);

if ($pass)
#ignore comments and growlnotifys and commands and only pass REMs
{$lines[$i]=~s/^rem //;$lines[$i]=~s/^REM //;
$lines[$i]=~s/ msg/:/;$lines[$i]=~s/ MSG/:/;
print OUTFO $lines[$i];
}
$i++;
}

print OUTFO "===contacts=========\n";
$a1=`contacts -H -f "%n %mp %wp %hp" Cleo`;
$a1=~s/-/./g; print OUTFO $a1;
$a1=`contacts -H -f "%n %wp %op" Popeye`;
print OUTFO $a1;
$a1=`contacts -H -f "%n %mp %e" Betty`;
print OUTFO $a1;
$a1=`contacts -H -f "%n %mp %wp %op %a" Snidely`;
$a1=~s/\n\n/\n/g; print OUTFO $a1;
$a1=`contacts -H -f "%n %mp" "*"`;
$a1=~s/-/ /g;print OUTFO $a1;
$a1=`contacts -H -f "%n %mp %a" God`;
$a1=~s/\n\n/\n/g; print OUTFO $a1;

print OUTFO "===random stuff====\n";
print OUTFO "The Hamburglar's place: Practice, practice, practice, and take a left.\n";
print OUTFO "Library: open until 8pm.\n";
print OUTFO "===thumb calendar=====\n";#thumbcalendar.com
print OUTFO " Su Mo Tu We Th Fr Sa JUL (31)\n";
print OUTFO " Su Mo Tu We Th Fr Sa SEP (30)\n";
print OUTFO " 01 02 03 04 05 06 07\n";
print OUTFO "01 02 03 04 05 06 07 08 09 10 11 12 13 14\n";
print OUTFO "08 09 10 11 12 13 14 15 16 17 18 19 20 21\n";
print OUTFO "15 16 17 18 19 20 21 22 23 24 25 26 27 28\n";
print OUTFO "22 23 24 25 26 27 28 29 30 31\n";
print OUTFO "29 30 31\n";
print OUTFO " Su Mo Tu We Th Fr Sa JUN (31)\n";
print OUTFO " Su Mo Tu We Th Fr Sa AUG (31)\n";
print OUTFO "===\@shopping========\n";

$fname="/Users/Surly/todo.txt";
open(INFO,$fname);
@lines = ;
close(INFO);

$i=0;
while($lines[$i+1]){$i++;}

while($i>=0)
{ $pass=(($lines[$i]!~/^x /));
$pass=$pass & (($lines[$i]!~/\@office/));
$pass=$pass & ($lines[$i]=~/buy/);
$pass=$pass & ($lines[$i]!~/\@online/);

if ($pass)
{$lines[$i]=~s/ \@shopping//;
$lines[$i]=~s/^buy //;
print OUTFO $lines[$i];
}
$i--;
}

close(OUTFO);

Thursday, June 04, 2009

The Surly Teabag Consumer Report on the Last.fm subscription

So I wanted to play a particular album. It looked like it was playable from last.fm (under their current you-can-play-any-streamable-track-3-times-for-free policy) but that seemed to entail clicking each and every one of those little play buttons. I wanted to stream a continuous set of songs so I could work without interruption. So I anted up the 3 bucks for a one-month subscription to last.fm. My conclusion is that it is worth it, but first some details:

The last.fm playlist creator has a very clicky interface. What I wanted was just to click on something near the album and put the whole thing in a playlist. But there seems to be no option for that. So you've got to find every song you want to hear and click on it a couple of times to get it on the playlist. At least dialog boxes can be dismissed by hitting the return key. Before you can play a playlist, it needs at least 45 playable tracks by 15 different artists, so be prepared to do a lot of clicking.

Now the good news. It is freaking awesome: I discovered a bunch of new songs that I loved, so I went out and bought them. This is probably the most efficient way to track down those elusive tracks that I want to listen to over and over. Thank you, last.fm.

Saturday, May 09, 2009

In search of the ideal Twitter command-line client

After testing out a bunch of candidates, my new default command-line Twitter client is Twyt. Do not be fooled by the spartan front page. Active development is taking place. It's written in Python and (as of version 0.9.2) has the virtue of offering the following command-line options for the "check stati of friends" command:

-s SINCE, --since=SINCE
The date or ID of a message to list status messages
from.
-P PAGE, --page=PAGE Lists the PAGEth page of status updates
-n COUNT, --count=COUNT
The number of statuses to retrieve (max 200)

Unfortunately, it seems to be suffering from the same malady as other programs: No matter what value I put in for the --since flag, I still get the same 20 stati... The --page flag does work though, and the --count flag is doing something...

However, I also like the twixer client because it has implemented a few commands that I have not found in any other command line program. According to its command line options, it can 1) list your friends, 2) list your followers, 3) show the little information box on a user, and 4) delete stati and direct messages.

Unfortunately (and maybe I am doing something wrong here), but as of version 0.1.1, it will only show the little information box on me, no matter who I put in. But status deletion works great!

Sunday, May 03, 2009

General-purpose command-line Bayesian filter

The idea for using Bayesian classification (e.g., the kind of probabilistic estimation of whether an e-mail is spam, based on how well its features match the features of things you have previously called "spam") for filtering things like Twitter status update is now out there (via Tao of Mac). As I often view such updates from the command line, I decided to give it a shot.

There's a wonderful little program called dbacl which stands for digramic Bayesian classifier. It's really nicely documented and installs without much trouble under OS X. I only had one installation issue: There was some weird error message about a file called "missing" being missing, but this did not interfere with installation. One perplexing trait of the program: When I copy example commands from the documentation, they sometimes fail. The reason is that the examples had options on the end of the command, like:
% dbacl -c one -c two -c three sample4.txt -N
The solution was to just rearrange the flags so the filename is at the end.

I wrote this little (specific purpose) pair of scripts for applying Bayesian filtering to Facebook updates (as pulled from the RSS feed).

The training script looks like this:

#!/usr/bin/perl
$DBACL_PATH="/Users/surly/.dbacl";
#TODO: capture keypresses instantly with Term::ReadKey;
@lines=`curl --fail "http://www.facebook.com/feeds/friends_status.php?id=[fill-in]&key=[the-blanks]&format=rss20" -A "Mozilla/4.0"|grep title|grep -v "s Friends"|perl -p -i -e "s/^\s+//"|perl -p -i -e "s/'/\'/g"|perl -p -i -e "s/ \'s/'s/g"|perl -p -i -e "s/\&/\&/g"|perl -p -i -e "s/\//g"`;
$i=0;
while($lines[$i])
{ $cat=`echo "$lines[$i]"|dbacl -v -c ok -c bad -c urgent`;
$lines[$i]=~s/\s?\<\/title\>//g;
if ($cat=~/ok/) { print " $lines[$i]";}
elsif ($cat=~/bad/) { print "-$lines[$i]";}
elsif ($cat=~/urgent/) { print "*$lines[$i]";}
#categorization prediction, done
print "Categorize as: o)k, b)ad, u)rgent:\n";
$cat=<>;$cat=~s/\n//;
if ($cat=~/o/)
{ `echo "$lines[$i]">>$DBACL_PATH/ok.d`;
print "Categorized as ok.\n";}
elsif ($cat=~/b/)
{ `echo "$lines[$i]">>$DBACL_PATH/bad.d`;
print "Categorized as bad.\n";}
elsif ($cat=~/u/)
{ `echo "$lines[$i]">>$DBACL_PATH/urgent.d`;
print "Categorized as urgent.\n";}
$i++;
}

It marks each status update with a symbol to indicate what the prediction would be based on the existing set of information.
dbacl has one counter-intuitive feature; it does not have any memory. One must keep all the information that one wants to train the filters on (here, in the files ok.d, bad.d, and urgent.d) and then refresh the filter by training it on the entire corpus, as is done in the script below. Briefly, it fetches the updates, trains the filters (using regular expressions for defining Bayesian features, specifically so I can filter on the @somebody grammar that Twitter uses), and then displays all the stati, using ANSI escape codes to emphasize or de-emphasize them based on their categorization.


#!/usr/bin/perl
$DBACL_PATH="/Users/surly/.dbacl";
@lines=`curl --fail "http://www.facebook.com/feeds/friends_status.php?id=[fill-in]&key=[the-blanks]&format=rss20" -A "Mozilla/4.0"|grep title|grep -v "s Friends"|perl -p -i -e "s/^\s+//"|perl -p -i -e "s/'/\'/g"|perl -p -i -e "s/ \'s/'s/g"|perl -p -i -e "s/\&/\&/g"|perl -p -i -e "s/\//g"`;

`dbacl -l $DBACL_PATH/ok -g "^([[:alpha:]]+)" -g "[^[:alpha:]]([[:alpha:]]+)" -g "^(@[[:alpha:]]+)" -g "[^[:alpha:]](@[[:alpha:]]+)" $DBACL_PATH/ok.d`;
`dbacl -l $DBACL_PATH/bad -g "^([[:alpha:]]+)" -g "[^[:alpha:]]([[:alpha:]]+)" -g "^(@[[:alpha:]]+)" -g "[^[:alpha:]](@[[:alpha:]]+)" $DBACL_PATH/bad.d`;
`dbacl -l $DBACL_PATH/urgent -g "^([[:alpha:]]+)" -g "[^[:alpha:]]([[:alpha:]]+)" -g "^(@[[:alpha:]]+)" -g "[^[:alpha:]](@[[:alpha:]]+)" $DBACL_PATH/urgent.d`;
$i=0;
while($lines[$i])
{ $lines[$i]=~s/\s?\<\/title\>//g;
$cat=`echo "$lines[$i]"|dbacl -v -c ok -c bad -c urgent`;
if ($cat=~/ok/)
{ print "$lines[$i]";}
elsif ($cat=~/bad/)
{ print "\033[0;37;48m$lines[$i]";
print "\033[0m";}
elsif ($cat=~/urgent/)
{ print "\033[0;34;48m$lines[$i]";
print "\033[0m";}
$i++;
}


This is a first cut. The dbacl documentation suggests not using two-word combinations when the corpus is small, due to the possibility of overfitting. Much remains to be learned about the art of Bayesian filtering.

Think of the possibilities for using Bayesian filtering on things beyond spam filtering. Imagine using it to filter through social networks or music (see TheFilter). Imagine a web browser that watches what links you click on and which pages you bookmark (or mark as "good") and then highlights links that it predicts you will like, possibly based on pre-fetching and evaluating the link contents. I love the feeling of unbounded potential.



Further reading:
A much improved status update reader with Bayesian filtering

Friday, April 10, 2009

What makes neon colors look "neon"?

A friend asked why there is no neon brown. It turns out that a better name for neon colors is "fluorescent". Fluorescent colors appear unnaturally bright because they are. They contain pigments which are made up of molecules which are very efficient at absorbing high frequency light and then emitting lower frequency light. For instance, some molecules absorb ultraviolet light and re-emit some fraction of it in the blue. This is the principle behind those detergents that make clothes look super-bright white. (It's also why printer paper sometimes look blindingly white.) Your eye expects that the brightest something can be, is if all the ambient (visible) light is reflected back, but by sneaking in extra energy from the UV, something can actually be brighter than it should be. (I admit to being surprised by the part about the brain sensing the amount of illumination something is getting and then formulating an expectation about how bright things should appear, in an absolute sense.) Obvious corollary: You can't display a seemingly fluorescent color on a computer screen without doing something clever like making everything else appear dimmer.

Much of this I got from this page, which also explains that:
"Fluorescent blues are usually unimpressive because they must be fueled by farther-UV light, and there is not always an abundance of that in the ambient illumination. Red is typically fueled by green, yellow by blue, green by violet/near-UV. In a well-lit room you are guaranteed plenty of blue light, so fluorescent oranges have it made."

So, now we know why neon brown is so hard to come by - neon blue is too weak. But you could artificially create it (and neon purple), by illuminating a room with an appropriate wavelength black light. It would probably be easier to create neon tan. Neon beige, anyone? Don't get me started on neon grey.

What about gold and silver and copper (as in a box of Crayolas)?

This page relates Crayola's official policy on gold and copper. Cutting to the chase:
All Crayola crayons are made from paraffin wax, stearic acid and color pigment. To manufacture our crayons, the paraffin wax is melted and mixed together with pre-measured amounts of powder color pigments to produce the many colors of Crayola crayons.

The original formulation of Crayola copper and gold colored crayons contained bronze powder, which in the presence of stearic acid will oxidize over time, causing the green color. This oxidation process is the same as occurs on a penny or the "Statue of Liberty" as a result of an acidic environment. We successfully reformulated the copper and gold crayons to prevent oxidation from occurring by using a blend of pigments to achieve the copper and gold colors. This formula change took place during 1994 and continues today in both the copper and gold crayons.

The page goes on to refer to the Wikipedia entry on the gold color*:
"Of course, the visual sensation usually associated with the metal gold is its metallic shine. This cannot be reproduced by a simple solid color, because the shiny effect is due to the material's reflective brightness varying with the surface's angle to the light source."

* (Some argue gold is not a color at all, but a combination of yellow and luster. They obviously never had a pre-1994 box of 64 Crayolas.)

But I think that this is a little pessimistic. Suppose you take the little camera that is build into the top of the laptop screen and use it to monitor the ambient lighting, and the position of the user's head (and their likely viewing angle). Then it would be entirely possible to adjust the brightness of different bits of the gold in real time to synthesize the glittering of real gold.



If you liked this explanation, and would like to see more, send me your science questions. I will try to answer, and if the result is interesting enough, I'll post it. This offer is good until I get overwhelmed and take it down.

Sunday, March 29, 2009

Reimagining great works of art, as they might be in the Star Wars universe




My other favorites: one, two, three, four, and (apparently from some other contest) five. The full gallery is here.

Saturday, March 28, 2009

Google Voice: interface for WAP browser and other tricks

I have one of those cell phones that isn't a fancy cutting-edge touchscreen phone/PDA. It does have a WAP browser. I like it. And since I can use the mobile Gmail client on it, I thought to wonder whether something similar is available for Google Voice. It turns out that it is:

On your phone's browser, enter the URL http://voice.google.com, and you will wind up at the URL https://www.google.com/voice/m/. The interface is nice and clean. I actually like it more that the web interface. It seems to offer every feature that the web client does. (This seems likely to mean that any voice mail you receive will be transcribed and available here as text.) Most importantly, it gives a "Quick Call" option and an SMS option, allowing you to place calls or send text messages that appear to come from (because they are routed through) your Google Voice number, and are without additional charge. The only disadvantage to connecting directly from your phone is that the number must be manually entered, or else found in the Contacts part of the Google Voice interface.

But there is a workaround:

From a GrandCentral Google Group thread:

GV has a nifty feature that you may use to store and call your contacts' cell phones and show your GV number on their phones. This only works with contacts with cell phones that can send and receive text messages.

(1) First make sure you can receive your contacts' calls and messages on your cell phone (If you have set up a particular contact so that their calls are not sent to your cell phone this will not work)

(2) Using GV website's SMS feature send them a message and ask them to reply to it.

(3) When you receive your contact's reply on your cell phone you will notice that it apparently comes from a phone number in the "406" area code. This is a number the GV has assigned to your contact for your account only. Save this number in your cell phone as your contact's phone number.

(4) Call this number next time you want to make a call to your contact from one of your GV recognized phones. The call will go from your phone to GV, GV will know that you are trying to call your contact, it will ring their phones and show your GV account number instead of the number of the phone you are dialing from.

I have been testing this method and so far it seems to work. It is a partial solution to your question but it is definitely more convenient than going through the GV phone menu routine. If you find a kink in this method please publish it as a response to this answer.

This 406 number is assigned for "your" account to "your" contact - so it will be unique to you. The same 406 number may be attached to another person's account for their contacts and it becomes unique to them. The way it works is when you call the 406 number from one of your GV recognized phones it goes to the Google server, the server identifies the originator of the call (you), find out which of your contact it has assigned that 406 number to, and then calls that person's cell phone. According to one Google employee this assignment of the 406 number to the contacts of each account holder will be maintained on a permanent basis so once you have saved the number you may just dial it to reach the contact any time in the future.

Saturday, March 21, 2009

Googling for phrases: Trying to route around new inefficiencies

In the good old days, Google's search engine supported searching for exact phrases in two different ways:
You can search for phrases by adding quotation marks. Words enclosed in double quotes ("like this") appear together in all returned documents. Phrase searches using quotation marks are useful when searching for famous sayings or specific names.
Certain characters serve as phrase connectors. Phrase connectors work like quotes because they join your search words in the same way double quotes join your search words. For example, the search:
[some-example-I-have-forgotten]
is treated as a phrase search even though the search words are not enclosed in double quotes. Google recognizes hyphens, slashes, periods, equal signs, and apostrophes as phrase connectors.

For a while now, the second approach has not been working.
Compare [green-ham-and-eggs] with ["green ham and eggs"]

Out of curiosity, I googled ["green-ham-and-eggs"] and got what appeared to be the same results as for ["green ham and eggs"].

The official position now seems to be:
The hyphen - is sometimes used as a signal that the two words around it are very strongly connected.

There might even be some utility to this interpretation, though for now it is depriving me of my favorite way of refining Google searches.

This blog posting sheds a tiny amount of light on why Google did this. At least, it teaches me how to save a keystroke: in searches, OR can be replaced with | (the pipe symbol or vertical bar).

I'm trying to figure out how to fix this on my own. The most obvious way of restoring this behavior would be to use an URL-rewriting proxy, like ick-proxy.

The knee-jerk reaction is generally to propose some kind of Greasemonkey script or Firefox add-on, but I would like a solution that is as browser-independent (and indeed, computer-independent) and configuration-free as possible.

Someone has also pointed out that the Microsoft search engine supports the dashes-as-phrase-connectors functionality, though I shudder at the idea of switching to Microsoft.

I will report back once I get around to setting up ick-proxy.

Friday, March 20, 2009

Helvetica (the documentary): a summary and an opinionated review

A documentary about a font seems like a wonderfully geeky idea. However, I felt like there wasn't much to this film. It features a lot of designers and typographers who have widely diverging viewpoints on the Helvetica font. (You know, the one that looks like this.)

One guy says that Helvetica is the McDonald's of fonts: a ubiquitous, thing which people choose by default, even though it's crap. Like I hadn't already thought this myself!

Others believe that Helvetica is the evolutionary endpoint of a particular aesthetic, or even the best of all possible fonts.

Still another guy thinks that Helvetica was great in the sixties, but its flaw is that all the characters were meant to look maximally alike which makes it harder to read. Best line of the film: While he describes himself as loving fonts, he says, "I've never sort of woken up with a typeface coming out, you know, like some people... I've got to do this, and they go to their, whatever, their easel, and these amazing brush strokes. I don't have that urge. You know, I wake up and usually I want to go back to sleep."

Beyond the opinions, most of the information in the film may be found in the Wikipedia article on Helvetica (the font).

If you like montages of Helvetica-in-the-wild, this film is for you.

Myself, I prefer Gill Sans.

Edward Tufte does too.

Disabling AdSense's interest-based ads (from both sides)

I still find the idea of my activities being tracked all over
the Internet creepy (though oddly not as creepy when Google
describes it, making it sound like just increasing ad relevance), so I decided to modify the settings on my AdSense account to
opt this blog out of the tracking program which means a) clicks
on ads here will not be added to a user's tracked behavior and
b) ads on this site will not be based on behavior elsewhere.

One can also simply delete and block all cookies from doubleclick.net
to get the same behavior. Or else use the various opt-out schemes.

Saturday, March 14, 2009

Why I subscribed to eMusic and why I eventually cancelled my subscription

I used to buy a lot of CDs, but I disliked having to cart them around every time I moved. To break my habit of poring over the racks at used CD stores, I subscribed to eMusic. There were a lot of tracks that I wanted from the band They Might Be Giants on there, so I took the plunge and swore off the poring. And it was great. I got a very high bang-for-my-buck initially as I first tracked down types of music I liked and plunged deeper into them and then later kept finding new things that I enjoyed. But after the first year, it became more of a chore to search through the music, trying to find something I wanted. One can easily download lots of stuff and wind up deleting it all - if one is a scrutinizing stickler. But I enjoyed the scrutinizing, as I saw eMusic as a good way to cheaply search for amazing new music.

Eventually, I realized that I had just switched from poring over racks of CDs to poring over pages of mp3s. And after a couple of years I was definitely getting diminishing returns. I wasn't always downloading my full 40 tracks before they disappeared at the end of the billing period.

The breaking point came when eMusic announced that they were changing the rates for existing users. For the $10/month subscription, it was going from something like 25 cents per track to 33 cents. I sorted through my iTunes library to determine what my good finds were for the previous year. I figure that there were only about three CDs that I thought were good downloads and three individual tracks. And in terms of actually finding new things, eMusic accounted for less than a third of the year's finds. (I was finding more completely new stuff came through last.fm.) This was no longer worth $120 per year. The final change that really made this decision possible was Amazon's entering the DRM-free mp3 market. That had been eMusic's second-most appealing feature (after price) back when the options were the iTunes Music Store or buying CDs.

I do think that there was a period of about a year and a half where my eMusic subscription was worth what I was paying for it, but whether it was that I could no longer find the tracks that would have appealed to me, or that eMusic has just run out of things I wanted to listen to, the time had come to switch.

Thursday, March 12, 2009

GrandCentral is finally reborn as Google Voice

GrandCentral was essentially a proxy phone number which people could call and which would ring all of your phones (land lines a bit before cell phones). Or depending on your settings for the caller, it could ring some subset of your phones, go straight to voice mail, or be blocked entirely (Sayonara, telemarketers!). Voice mail messages could be played from a web interface. Calls within the United States were free.

Google Voice adds automatic transcripts of voice mail, cheap international calls (since it works as VOIP) [apparently this is the only feature that costs money], conference calls, and the big one: It does what you would expect it to with SMS messages to your GrandCentral number: It forwards them to all your cell phones.

You can also send a Google Voice number an SMS by e-mail. The Google Voice address is [your 10-digit number]@txt.voice.google.com

Upgrading is apparently optional for existing GrandCentral users at this point. Those who choose to do so would be wise to export their GC contacts first, as they will have to be re-added under the new Google Contacts scheme. [I have accumulated 15 spammer numbers which I would not want to lose, and while it is possible do delist your GrandCentral number from telemarketers like any other number (via donotcall.gov), I'd wager that some of the spam calls I got would not be filtered out by this mechanism.]

For everyone else, there's the official Google Voice invitation request form. Or you can request an invitation via the Google Voice Twitter account.

Wednesday, March 11, 2009

How to keep files synced between two computers

My old solution to syncing files was cvs.

My new solution is Dropbox. Dropbox integrates perfectly with the Finder on OS X, working through a folder (called "Dropbox"), the contents of which are automatically synced with a central server whenever there is a change in the file contents (whether on the local computer or a remote computer). File and folder icons are modified with a tiny symbol which indicates the synced/syncing status of the file.

The downside is that when one computer is offline and a file is changed on both computers, Dropbox handles the changes less well than cvs. (cvs merges the changes intelligently and flags in the file where user assistance is needed with the merging. Dropbox just saves the conflicting version to a separate file.) I did recently find that syncing had stopped, but upgrading to a newer version of the Dropbox application solved that problem.

Also, files are available through a web interface and old versions can be easily obtained. It works with all major operating systems. The first 2 gigabytes are free. It is elegant and makes my life easier. I give it high marks (to be updated once I figure out how many teabags are in my rating system).

Dropbox currently has a referral program where, if you register through this referral link, both you and I will get an extra 250 megabytes.

Bonus link: How to install a console version of Dropbox (no GUI!) on Linux (thanks to Jared of the Mostly CLI blog)

Tuesday, March 10, 2009

Why e-books suck and an extended rant

It's the same reason that all media encumbered by "digital rights management" suck: One little perturbation to the system and you are locked out of what you spent your money on. I have bought several e-books for the Palm, chiefly from fictionwise.com. My new PDA stopped working. I switched back to my old PDA. Now it is impossible for me to read my old books. Some of them I never even finished in the first place. Unlike meatspace books, I can not lend them, sell them, or trade them. The money is gone.

Amazon's Kindle 2 is appealing to me, not because I need an e-Book reader (a PDA with an offline browser is usually quite sufficient). (The ability to convert PDFs into something the device can display seems quite useful though.) As pointed out by xkcd, it's because of its free cellular Internet connection via Sprint EVDO. Apparently, the Kindle's browser is primitive, like that of a smart phone. Therefore I would estimate the value of this service is in the neighborhood of $100 per year (based on equivalent costs for prepaid Internet access). More minuses: the interface is awkward and slow, and the Kindle itself is too big to fit in my pocket, so how often am I going to have it with me?

However, whenever I go on trips, I wish I had something smaller than my laptop that would still give me most of its functionality (web browsing, music playing, presentation editing, paper reading). The Kindle is not yet there, and neither is the iPhone. Maybe next year...

Sunday, March 08, 2009

This American Life, Live!

This American Life, Live!
Last year, This American Life held a live show in New Your City, to promote the second season of its television show, and then simulcast it to a bunch of movie theaters around the country. This year, they are doing it again, only this time, it will be one of their stage shows which will be eventually edited down into a radio show. It is going to be amazing! Ira Glass is one of the great entertainers of our time.
Here are some of the previous live TAL shows, which are among my very favorites:
The event page for this year's show is here.

Watchmen: the movie review

I saw the Watchmen movie last night. I think it only works as a film if you have read the graphic novel, as the movie feels like it is missing the layers of sophistication that allow one to get involved with the characters and ponder the questions that the comic book raises. My advice would be to read the graphic novel, and then wait for the special DVD release, which is supposed to have a lot more footage that makes it more faithful to the comic book (including the comic-book-within-a-comic-book pirate sequences, which emphasize the metaphor). (Although weirdly, it turns out that the extra footage has already been released on DVD. And apparently there's an animated version of the graphic novel called Watchmen: The Complete Motion Comic? Is this really necessary? If all the voices are done by one guy, what does this add to the Static Images Comic? Something tells me that somebody needs to read Scott McCloud's Understanding Comics.

Here is Alan Moore's blurb: "Understanding Comics is quite simply the best analysis of the medium that I have ever encountered. With this book Scott McCloud has taken breathtaking leaps towards establishing a critical language that the comic art form can work with and build upon in the future. Lucid and accessible, it is an astonishing feat of perception. Highly recommended."