Thursday, May 31, 2007

[web] reCAPTCHA

Absolutely brilliant use of crowdsourcing to digitize books and old text:

1. When OCR scans the original text, it throws out words that it cannot read with high confidence, and gives it to reCAPTCHA
2. Instead of normal CAPTCHA which asks for one text string, reCAPTCHA asks users for two words, one it knows the answer to, the other it doesn't
3. If user answers the known word correctly, then the answer to the unknown word is marked as a likely-winning candidate
4. The system collects a number of sample of likely-winning candidate, and determine what the right word is likely to be
5. All this, while serving the double duty of stopping bots and spam!

Just brilliant.

[web] Lumosity, Gizmoz, Google Gears, MS Popfly, Maplets

Done playing:
- Gizmoz - Create widgets with animated avatar and voice from your own picture (or stock ones) - Need a good face shot of Zee or Gray and try this out for real.
- Google Maplets - Mini-apps that users can embed within Google Maps - Didn't see any killer app(let), yet.
- Stardoll - A whole community built around dressing paper dolls - Personally it was only fun for about five minutes but I guess I'm not the typical 5 to 15 year old girls that make up the 7.7 million members.
- Grand Central - Phone forwarding for life and unified messaging - Signed up. Tested. My cell rang, which was cool. Except that, I already have my cell number for life.
- Yak4Ever - Free international calls - Can't figure out how they plan to make money? The number that I got assigned to is a not in CA, so even if the international call is free I'd have to pay long distance from my land line. My international phone card at 4 cents a minute to Taiwan is cheaper.
- Platial - Markup your copy of Google Map however you like - It's always fun to look at the maps. But marking it up wasn't all that satisfying. Maybe the UI was too slow.
- ThisNext - Shopcast trying to turn social shopping - You can build a wish list, but no friend's list? Really, you cannot be "social" anything without a friends list.

To go back and play more later:
- Lumosity - Brain Fitness Game - Fun. The "bird watching" game demonstrates that I don't know jack about birds. The "raindrop math" game is fun like House of the Dead Typing Game.
- Google Gears - Browser extension that enables offline web applications
- Microsoft Popfly - Website and mashup builder using Silverlight
- Google Mashup Editor - Because everyone cool has a mashup editor - Signed up for beta
- Widgetbox - Another widget platform, but specifically targeting bloggers as widget consumer
- Fix8 - Create animated video from your movement and expression using webcam

Wednesday, May 30, 2007

[log] Dog Park

Where: Culver City Dog Park
When: 2007 May 26 and 27

- Mary the amazing gray poodle that begs to play fetch
- Jose, the free saftey, "why are we all running up and down? what the point of that ball?"
- Jose, the brave, "Er, Jose, you don't need to protect your friend from his owner"
- Jose, the social butterfly, "gotta sniff every dog's butt"
- Tofu is eating poop!

[outing] BBQ at 141 S Clark

Where: 141 S Clark
Who: Gray, Zee, Robert, Pierre, me, and Jose
When: Sunday 2007 May 27

- The empty complex
- Kick ass 2-pound tri-tip by Zee. Pour a can of coke in your marinade, he said
- And there was another 2-pound of tri-tip to go
- Running up and down the hallway with Jose
- Gray's next pet will so be Mr Snuggle
- Did Robert really charted out his new apartment in 3 different version of diagrams on Visio
- "If you jump from that window with a running start you can totally land in the pool"
- Is Robert still doing his laundry?
- We'll have a shot each time we move a big item

Tuesday, May 29, 2007

[code] Pretty Form CSS

Clean CSS for making a pretty form with Field Set, Legend, and Focus:

form.pretty-form {margin: 0; padding: 0;}
form.pretty-form fieldset {border: 1px solid #ddd; padding: 4px 8px 10px 8px}
form.pretty-form legend {color: #1f9dbd; font-weight: bold}
form.pretty-form label {display: block; font-weight: bold}
form.pretty-form label span {font-weight: normal; font-size: 10px}
form.pretty-form label span.required {color: #b00}
form.pretty-form label span.optional {color: gray}
form.pretty-form input.pretty-field {padding: 2px 5px; border: 1px solid #999}
form.pretty-form input.pretty-field:focus {background-color: #fffadb; border: 1px solid #cbb945; color: #776b1b}

Sunday, May 27, 2007

[code] Superscript and Subscript (That Look Good)

#bodyContent sup {
font-size: smaller;
vertical-align: baseline;
position: relative;
bottom: 0.33em;
#bodyContent sub {
font-size: smaller;
vertical-align: baseline;
position: relative;
bottom: -0.25em;

The source from Wikipedia talks about this as a way to fix the line-height issue on Safari and Opera, but on IE and Firefox produces a much softer and better looking superscript and subscript effect.

[log] Jose

Name: Jose
Breed: Mini Pinscher Chihuaha Mix
Born: Circa 2006 May
Temperament: Absolutely sweet and calm, and hopelessly addicted to snuggling.
Brownie points: Got so excited when he saw Pierre came home, that he accidently peed on him. Good dog!

Friday, May 25, 2007

[muse] The Blame Game

The last software release contained a bug, but it's only discovered days and weeks later and now the data is all messed up. What to do?

- Blame QA -- Why of course, isn't your job to test?
- Blame Development -- Why did you write buggy code?
- Blame Product Management -- Why weren't you clear in the requirements?
- Blame Project Management -- Why didn't you identify this dependency?
- Blame Business Owner -- Why didn't you specify that detail in your request?
- Blame End Users -- Why didn't you check the result when we released it? You would have realized the problem much earlier.

The reality is that no single person is ever to blame. The purpose of the different teams is for us to serve as safety net for each other. So everyone shares credit for a success, and everyone is responsible for a problem. Everyone can learn from a problem and do a little better next time.

So don't ever ask "Why didn't you catch this problem" -- It serves no purpose other than to be condescending -- Do you really think that anyone actually wants things to not work?

I am very lucky to be part of a team where we don't play the blame game. But I haven't always been this lucky. If your workplace is blame-game-infested, try this counter-measure -- Step up and take the blame. Yup. All of it. Afterall, you are partly to blame anyways, and taking all the blame may just end the game, so everyone can return to some productive and interesting work.

And that, is building good karma.

Thursday, May 24, 2007

[outing] A Funny Thing Happened on the Way to the Forum

Where: Lyrics Theater
Who: Corinne and I
When: Saturday 2007 May 19

- Killer Endive Salad w/Blue Cheese, Walnuts, Pear at L'Hermitage
- Clever, clever Sondheim
- Is that a really tall man or are those four midgets?
- A theatre owned by a mom and her sons

[outing] Appetizer and Wine

Where: The house
Who: Marie and Renzo, Ivy and friends, Jeremy, Paul, Shu, Alan, Corinne, Andrew, us
When: Sunday 2007 May 20

The fantastic menu, in no particular order
- Marie's cheese fondue with mustard and worchester's sauece
- Ivy's cheese and berries plate
- Ivy's friend's shortbread
- My mac and cheese with guyere and applewood bacon
- Pierre's teriyaki chicken
- Corinne's layered taco dip
- Corinne's flourless chocolate cake
- Corinne's homemade chips
- Jeremy's prociutto and melon
- Renzo's salami and cheese
- Paul's empandas
- Andrew's BBQ chicken pizza
- Andrew's chocolate bark
- Andrew's raspberry cheese tart
- Bottles of wine consumed: 7
- The first bottle of wine consumed: My peachy wine that Pierre made fun of. Ha.

[outing] Hermosa Beach Strand

Where: Alan's, Hennesey, Sangria
Who: Alan and Maureen, Adam, Vargo Sr and Jr, Mike and Shelby, Helton, Sheila, us
When: Friday 2007 May 18

- Wow you have big feet!
- Midnight pizza at Paizano's
- "Welcome to the city of Lomita!?"
- The 2 hour drive home from Hermosa, starting at 2am

Wednesday, May 16, 2007

[code] Apache handler, Perl, Ruby, CGI

Before I figured out about Apache cgi-script handler, I foolishly thought there was something magical about only Perl could be use as CGI, but couldn't figure out what was controlling that. So I wrote a perl script to call ruby because I stubbornly wanted to use Ruby instead.

Of course now I know that it wasn't perl at all; it was just that Bluehost had .pl defined to use cgi-handler by default, and all I had to do was use the .pl extension and it would have worked (but of course it's better to simply add .rb as another cgi-script extension)

Now I just have a goofy perl script. Well, it was fun.


## This works, but, the system function returns an extra 0 at the end
## $result = system("/home/username/public_html/MyRubyProgram.rb $ARGV[0]");

## This works perfectly. No extra cruff.
open(F, "/home/username/public_html/MyRubyProgram.rb $ARGV[0] |");
while (defined($result = )) {
print $result;


Sunday, May 13, 2007

[ruby] Hash of Hashes

One little bit that was not so obvious from the various Ruby docs - How to create Hash that has Hash as values.

This works:
$States =
$States["California"] =
$States["California"].store("Los Angeles",
$States["California"].fetch("Los Angeles").store("District 1", "90035")

This does not work (does not actually give you a syntax error. the child hash assignment would go through silently, but you can never get back the child hash)
$States =
$States["California"] =
$States["California"]["Los Angeles"] =
$States["California"]["Los Angeles"]["District 1"] = "90035"

[outing] Sleeping Beauty Wakes

What: Sleeping Beauty Wakes
Where: Kirk Douglas Theater, $40 + $4 handling fee, with Corinne

- Official Synoposis: After her centuries long snooze, Beauty wakes to find herself far from her fairy tale kingdom in a contemporary sleep-disorder center, where all the princes seem to have disappeared!
- The best musical I have ever seen (Disclaimer: I am sucker for fairy tale spoofs)
- Never imagined sign language so expressive and effective as choreography
- Amazing integration of instrumental artists and sets
- The lady who kicks-ass at singing, acting, and violin playing
- I laughed, I sniffled, I want to see it again

Wednesday, May 09, 2007

[log] LG LX150

The Nokia 6225 drowned itself. And for more than week Sprint kept telling that they cannot activate new phone because they were migrating my account to the new billing system with the Nextel merger. After multiple fruitless trips to Best Buy and Sprint store, and calls to 800-SPRINT1, finally, new phone is here. Log of observations:

Motorola MOTOKRZR: Absolutely sleek, no doubt. Love the matted-rubbery surface on the bottom of the phone. But, it's larger than is necessary, with a music player and camera that I will never use. And the Deal Breaker: Ridiculously slow menu action. You click menu, it takes a full second for the phone to react. So if you ended up double-clicking, that just makes the menu come up and immediately go away. No thanks. I'm not loading Internet Explorer. I'm loading the phone menu, for gods sake.

Samsung Upstage: Zee geek-factor approved. Definitely a looker. Deal Breaker: One, on the phone side, the LCD screen is only the height of your eyebrow. Two, it feels very uncomfortable to hold when making calls. But then again, maybe "making calls" just isn't a fashionable priority for cell phones anymore.

Sanyo Katana: Immediate Deal Breaker: Buttons look and feel absolutely cheap. I don't need to look cool but these buttons are below my (very low) vanity standard.

Motorola MOTORAZR: It's cool. It's popular. It comes in a cool red. But Deal Breaker: It's so damn big. I know it's hailed as a breakthrough in thin phone design and all. But I'm not so sure if it counts when you save on the thickness by adding on the girth.

Samsung A640: Sleek exterior, looks like a phone that Knight Rider would carry, if Knight Rider carried a cell phone. Though online reviews complain of worrisome reliability issues and weak vibrate. The buttons and interior feel cheap to me, but I convinced myself and pushed it above my vanity threshold. I was all ready to buy it until I saw in my browser window ...

LG LX150: Only offered online at the Sprint site. Saw it in the last minute while the customer service manager was talking to tele-sale about the mysterious $18 tax that they wanted to charge me for the $30 Samsung A640. And turns out , they only wanted $20 for LG LX150 (with $17 mystery government tax). I bought it sight unseen but hey, the CNET guy gave it a good review. Definitely not Zee geek-factor approved. No music player (good). No camera (excellent - means I can carry and use my phone when I need it the most, like waiting in line in federal buildings and looking for people at a concert). Buttons look and feel great. Superfast menu navigation. Internal antenna. Super light (3.2 oz). Tiny. The dark electric blue is easy on the eye and the flip phone is comfortable to hold.

A lovable, adorable piece of electronic. Now, if Sprint can just figure out how to actually activate my phone ... (or, keep those service credits coming)

Saturday, May 05, 2007

[play] Guitar Hero Analytics

What happens when a web analytics geek gets addicted to Guitar Hero: Career Score Maximization Analysis

"Revenue per Visit" translates perfectly to "Points per Note" in identifying optimization opportunities.

Now back to some real analysis that needs doing ...

Friday, May 04, 2007

[code] Regexp with exception for extension

Queston: What's the regexp that would match: "/foo", "/bar", etc.

But would not match "*.txt", "/foo/*.txt", "/foo/bar/*.txt", etc.

Answer: /\/(\w*|^.txt)$/

(Courtesy of Serge)

Tuesday, May 01, 2007

[log] Time Warners

- 10:45pm Pierre discovers that we've suddenly lost access to Sundance and bunch of HD channels. Pierre calls immediately.
- 11:20pm After a lot of "please hold", customer service rep #1 finally figured that they have changed the plans on us and we now need to pay extra to access the new "tier". After agreeing to adding $10 more to our monthly fee, they promised they fixed the issue.
- 11:25pm Pierre discovers that we've lost access to Showtime. Pierre calls again.
- 12:00pm Customer service rep #2 says they restored Showtime to our account.
- 12:05pm Pierre discovers that we've now lost access to HBO channel. Pierre nearly goes postal.
- 1:00am Customer service rep #3 is a 9-year veteran. After nearly an hour, she restored all our channels, and supposedly took on the extra $10 that customer rep #1 said we had to pay.

And I still have no idea how much exactly Time Warner plans to charge us the next month, because the online account management system only shows past bills. I suppose life is more fun with surprises.