One-click Unsubscribe: For ALL Your Emails

June 17th, 2009

I sign up for (let’s call it) 5-10 new web sites a week. It’s an occupational hazard.

(In fact, there’s an even weirder effect where sometimes there are web sites I know only from Webex demos or slide decks, and not from visiting the site itself. But I digress.)

As a startup, you SHOULD be sending retention and call-to-action emails. It’s a no-brainer. I don’t fault you for it. In fact, if I were an investor or advisor, I’d insist that you do it. (So many Web services naturally get more valuable over time, with the addition of users, data, events, etc., that you are often literally doing your users a favor the first time you harass them to come back.)

And, inevitably, the day comes when I tire of your appeals, and I want to pull the plug (or at least turn up the squelch knob).

BUT: when your “unsubscribe” link prompts me to sign in to your Web site — with a username I don’t remember (not even pre-filled in for me), with a password I even more certainly have forgotten, into your unfamiliar interface — in order to stop those email from coming in, then you are doing wrong.

Your “unsubscribe” link should have enough of a unique auth token in it that I can manage my email preferences. At the very most, it should be a two-or-three-additional-click process to verify with a round-trip email and link combination.

Instead, after two or three times trying to play nice and click your crappy “unsubscribe” link, I will just start clicking “report spam.” Enough of that, and your email throughput will suffer, and with it, all of your retention/CTA messaging.

So please: make it easy to unsubscribe (or at least to manage email prefs). Short-term minimization of your unsubscribe rate is not clever, and will ultimately kill your other metrics (not to mention incur user wrath).

Technologies I want an excuse to use…

June 3rd, 2009
  • Cassandra, the Facebook-derived, neither-row-nor-column-oriented-quite, massively distributed data store.
  • New hybrid languages that run atop Java VMs: Scala and Groovy.
  • Hadoop.  Just ‘cuz.
  • The R statistical computing system.

This video is no longer available due to a copyright claim by WMG.

March 3rd, 2009

Was looking today at a Facebook email (yuck) exchange regarding heavy metal and hard rock with an overseas pen pal. One of the links traded was to Ronnie James Dio’s “Holy Diver” video, a rockin’-ass metal song with laughably horrific production values in the vid.

That video in question I had found as a “related video” while surfing some other metal (probably Sabbath) on YouTube.

You heard me right: I probably never would have found out about Holy Diver if not for a bunch of dubiously-legit uploads to YouTube, which uploads, through the collective intelligence of commenting, tagging, and merely self-serving passively surfing users, became woven into a preferences graph that drove me into Dio’s grip. (Forgive me.)

WOE IS THE F-ING RECORD COMPANIES, THEY HAVE LOST SO MUCH REVENUE BOO HOO HOO BECAUSE I WATCHED A 20-YEAR-OUTDATED ROCK VID ON YOUTUBE, flail and rend garments etc.

Oh, wait — no, that’s not correct:

Yep, I bought the song. That is: the system works. Exactly like folks like Steve Jobs and the YouTube boys and your humble correspondent have been saying. There’s a place for freedom, and a place for commerce, and they can coexist. My anonymous and unknown friend in cyberspace puts up a crappy VHS-dub of Dio to share with me, I discover and rock out to it, and I buy the song.

But Warner Music Group (WMG) is operating on a plainly brain-dead policy. For instead of promoting that virtuous cycle above, they have chosen as a matter of policy to piss all over my unknown cyber-friend, me, RJD’s bank account, and indeed all precedents of good internet behavior. They have used the threat of violence-through-the-courts to have the link broken, and replaced with “This video is no longer available due to a copyright claim by WMG.” In WMG’s preferred universe, I never discover Holy Diver, RJD never gets his 10c or whatever from iTunes, and you never have to read this rant.

So, let me review the options WMG has:

1. Benign neglect toward music-sharing (especially of old and/or non-premium formats). Begets wider distribution of the catalog. Enables an increase in fan discovery and delight. Drives marginal purchases based upon that discovery and delight, and encourages the budding polyglot.

2. Relentless malignancy toward music-sharing. Squelches wider distribution of the catalog. Precludes an increase in discovery and reduces delight. Increases dependence on old, broken business model of top-40 radio and brick-and-mortar distributors, and cultivates mono-consumers who cleave to niche preferences.

In fair-mindedness, I must back down from the “brain-dead” accusation (see also my self-moderation imperative from earlier posts). There is, to be fair, one very good remaining reason why WMG might rationally choose #2 above. That is the legal doctrine that rightsholders like WMG must assert their rights or face losing them due to estoppel (I may have the legalese wrong). In other words, WMG may well have right-thinking, option #1 favoring executives, but if the general counsel raises the spectre of losing all copyrights, then that fear could drive an otherwise bad decision.

What we need is a law or court decision that provides some limited protection to copyright holders: a failure to enforce rights in one specific medium, format, or type of venue shall not be deemed a waiver of rights in any other medium, format, or type of venue. Then, WMG could let YouTube run amuck, with some sort of implicit understanding that HD videos or 128k audio would provoke legal action, but that sub-par stuff would not.

Otherwise, we end up in world where online video is Hulu, not YouTube. Don’t get me wrong — Hulu is fine for what it is: a way to rot your brain with mainstream media candy. It’s fun for catching “30 Rock” or “The Daily Show.” But YouTube is different and more important, culturally and economically, than Hulu, because it enables and empowers a different class of people to participate in the (potentially-)mass media.

Massachusetts Doesn’t Add Up

March 3rd, 2009

One nice thing about having a (practically infinitely) divisble currency unit is that you can use arithmetic to sum your accounts and settle them on a “net” basis.

Sometimes, such as in CDS clearing situations, this gets a bit hinky: lots of counterparties, etc. Sometimes, with lots of debits and credits on both sides, you really need to double-check to make sure you’ve got it all added up right.

But if I owe you A and B, I really ought to be able to pay you a sum C = A + B.

Not in Massachusetts.

Somehow this would seem less objectionable if it weren’t for the fact that I was trying to dissolve an inactive corporation so as not to have to keep shelling out tribute. You can (send one) check out any time you like, but you can never leave…

Create blank objects in Perl’s Class::DBI

February 24th, 2009

Perl’s Class::DBI is something I’ve had a bit of a love-hate relationship with. It’s definitely been useful. And, like with Ruby’s ActiveRecord, it can sometimes rocket-propel you 10x with a development task.

However, it’s got a lot of weird gotchas built in. One of them seems to be the inability to instantiate an object with no data. Now, I know, you might well be saying, “why on earth would you instantiate an object with no data?”

Well, for one, perhaps you’ve got a legacy DB (or a non-legacy DB, for that matter) that intelligently fills in columns based upon a trigger, default, or other mechanism. (I’d venture to say that most all modern schemas use some variation of this, be it with AUTO_INCREMENT or sequence.) Another case is where you’ve got link tables that, on their own, don’t get any data added in until and unless their relationships get filled out.

In any case, it would be mighty nice to be able to insert an object that is empty, and have it just filled out with the defaults/triggers/whatever. But when you use Class::DBI, you get this nonsense:

  
DB<1> use My::Class;    
DB<2> $mc = My::Class->create; insert needs a hashref at  (eval 813)[/System/Library/Perl/5.8.8/perl5db.pl:628] line 2    
DB<3> $mc = My::Class->create({}); DBD::Pg::st execute failed: ERROR:  syntax error at or near ")" LINE 1: INSERT INTO my_table ()
                               ^ at
                                /Library/Perl/5.8.8/DBIx/ContextualFetch.pm
                               line 52.  

This is a Major Bummer, since Class::DBI Just Works for most other things.

Digging through the guts of Class::DBI, it seems like you could use something like the _prepopulate_id private method, but it only works if you’ve set __PACKAGE__->sequence(...). As it happens, I am using sequences under PostgreSQL, but I did not set up the sequence entry for each class (and don’t want to do so, as I’ve been using CDBI for 5+ years without ever bothering with the sequence method).

So, for all you PostgreSQL users with normal, plain-vanilla, single-PK tables that increment off a sequence, here’s some code to add to your base class (it’s always good to have your Class::DBI inheritors inherit CDBI through a base class that you define locally so you can add behavior to all your classes) that will permit a create_blank() constructor:

# this sub allows us to create a blank entry (with only it's 
# sequence-increasing ID): XXX NOTE: only works on Postgres  
# (pg-specific method of getting ID).  
our %CLASS_ID_SEQUENCE_NEXTVAL = ();  
sub create_blank {     
    my $class = shift;     
    #check cache     
    my $nextval_sql = $CLASS_ID_SEQUENCE_NEXTVAL{$class};     
    my $pk_col = $class->primary_column;     
    #cache miss:     
    unless (defined $nextval_sql) {         
        my $table = $class->table;         
        $table && $pk_col              
          or die             
        "create_blank only for single PK tables ($table $pk_col)";         
        ($nextval_sql) =              
        $class->db_Main()->selectrow_array(
                 'select column_default from information_schema.columns ' .
                 'where table_name=? and column_name=?',
                  {}, ($table, $pk_col)
             );
         $CLASS_ID_SEQUENCE_NEXTVAL{$class} = $nextval_sql;
     }
     die "didn't get a viable nextval() for class $class"
          unless $nextval_sql;
     my ($id) = $class->db_Main()->selectrow_array(
         'select ' . $nextval_sql
     ) or die "couldn't select $nextval_sql";
     return $class->create( { $pk_col => $id } ); }
   

I release the “create_blank” method above to the public domain, feel free to use and abuse.

The Downturn, REAL vs. FAKE VCs, and REAL WEALTH

January 7th, 2009

In early October 2008 I was asked by a local entrepreneurial booster group for a quote giving VCs’ take on the state of the financial world. Here’s what I wrote (but was too busy/lazy to blog) at the time:

  • REAL VCs have committed funds from stable, liquid, institutions who are not going away (state governments, universities, pension plans, countries).
  • REAL VCs have partnership agreements that last 8-10 years and aren’t tied to the current level of the NASDAQ or the price of anyone’s house.
  • FAKE VCs are everyone else who claims to be a VC but isn’t like the above.
  • FAKE VCs may be nice people but since they aren’t REAL VCs, you don’t know what you’re dealing with in working with them. So be cautious and “know your investor” if you are going to rely on them for your short- to mid-term capital needs.
  • Don’t sweat it; unlike the financial economy, early stage firms are inventing and creating and building things to sell in the real economy. Yes, you’d rather sell your company into a bubble. But great companies are often built in downturns and sold in upturns. Keep building and selling.
  • All the REAL WEALTH that humanity has ever created has been the result of new invention and teamwork. All of this CDO/MBS/hedge fund nonsense is just pushing around money. You, the entrepreneurs and inventors, are the real engines of true wealth creation and we VCs are honored to play a role in helping you do so.

All of this seems at least as true and relevant today as in the first days of October. So let’s all take a deep breath and keep this in mind: human ingenuity (Founders, CTOs, Visionaries) conceives new wealth; human effort and discipline (Engineers, Salesmen, Managers) bears it into the world; and the acceptance of it by markets (Customers, Sponsors) makes it viable and sustainable. VCs play our own humble role by advising the foregoing and making calculated risks of our (and our investors’) wealth and time. This is a GOOD THING, and furthermore, this is a cycle that despite its rough edges CREATES NEW WEALTH. That is not the case with all of the now-trashed asset classes (which were largely about flipping the same old bad ideas to one another) and the whining rent-seekers who (mis-)managed them.

If you’re reading this, you’re almost certainly a geek or a startup-world person. And that means you, like me, have a unique opportunity and burden to do the right thing in this crappy economic time.

So, please. (This goes for me too.) Turn off CNBC. Close the browser window for Yahoo! Finance. If at all you can, block out this volatility and pandemonium among the wealth-re-arrangers. And, please, focus and redouble your efforts on creating wealth and value that ultimately will be what allows our humble race of tool-wielding mammals to conquer ignorance, disease, malnutrition, isolation, Malthus, and generally the heat-death of the Universe.

Fixing Net::Google error with 404 File does not exist

August 26th, 2008

I was trying to install Net::Google 1.0 using CPANPLUS on my Mac OS X 10.5 machine, and kept getting a pesky error:

Service description 'file:' can't be loaded: 404 File `' does not exist  

One thing I had to do to fix it was install an apparent prerequisite, SOAP::WSDL. It wasn’t included by CPANPLUS.

Another thing I had to do to make the tests run was to include the lib/ (not just the blib/) directory in @INC when running the tests:

perl -Iblib/lib -Ilib t/001-search.t  

Even though that made the tests succeed, the installed module still wouldn’t work and gave the same darn error.

It turns out that some deeply, deeply nested code in Net::Google searches through @INC to find:

$DIR/Net/Google/Services/GoogleSearch.wsdl  

This file doesn’t get installed by “make install”, unfortunately.

So, I had to do the following:

rlucas:/Library/Perl/5.8.8/Net/Google$ sudo mkdir Services Password: rlucas:/Library/Perl/5.8.8/Net/Google$ cd Services/ rlucas:/Library/Perl/5.8.8/Net/Google/Services$ sudo cp \ ~/.cpanplus/5.8.8/build/Net-Google-1.0/lib/Net/Google/Services/GoogleSearch.wsdl \ .  

Now my Net::Google using scripts seem to work right.

Things Pictured on "The Stuff of Thought"

January 21st, 2008

Here is an attempt at an exhaustive list of objects drawn as colorful icons on the cover of the hardcover 2007 edition of Steven Pinker’s “The Stuff of Thought.”

  • fork
  • trash can
  • sunglasses
  • lamp, desk
  • salt shaker, pouring
  • football helmet
  • door (safe vault?)
  • film canister, 35 mm
  • mortar and pestle
  • plunger, toilet
  • vial, poison
  • condom
  • speaker, tweeter and woofer
  • cup with toothbrush
  • straitjacket
  • medicine dropper, dropping
  • monitor, computer
  • pills, medicine (capsules)
  • glove (gauntlet)
  • hammer
  • sardine tin, half-open
  • padlock, open
  • briefcase
  • teabag
  • hand grenade, pineapple
  • ice cream cone
  • pinwheel
  • bandage, adhesive strip
  • roll (paper or textile)
  • cigarette or joint
  • paintbrush, dripping
  • dynamite or firecracker, fuse lit
  • bullhorn
  • brassiere
  • toaster, bread popping out
  • bowling pin
  • Martini glass, with olive
  • Game Boy
  • toilet
  • cell phone
  • underpants, briefs
  • teacup and saucer, sugar cube above
  • computer with keyboard (different from computer monitor)
  • blow up doll
  • cigarette or joint (again)
  • flag, atop pole
  • pistol
  • dildo or vibrator
  • hatchet or axe
  • television set
  • handcuffs
  • clock face
  • roll, toilet paper
  • popsicle or creamsicle, bitten
  • straitjacket (again)
  • electric chair
  • lipstick
  • kitchen mixer or egg beater

I think (from the first hundred pages) that each of these items is referenced at some point within the text. But how interesting that the only two items that Steve-o repeats are a straitjacket and a cigarette or joint.

Against Blogging, or Why I Am Discontinuing This Futility

January 10th, 2008

1. An experiment in radical openness.

I started blogging in 2002/2003 as a way to post bug fixes that I’d discovered up onto the Web in a way that I and others could quickly find them. For example, if I got an “Parse Error #123 in dorklib.so,” and I found out how to fix it, I’d post up both the error message and the fix so that anyone searching on the error message would find the fix right away.

That worked really well for that limited purpose. I didn’t get a lot of traffic, but I did get a decent amount, and folks tended to leave positive comments. I wasn’t influencing crowds, but I was improving a few people’s lives each week at no marginal cost to me. Karma bonus. Bloghisattva.

Then, right after coming to work for Voyager Capital in late 2005, Web 2.0 and the social web were really taking off. I got the news, and decided I needed to really dive into the culture of “radical openness.” Sort of getting on board with the MySpace generation (I’m a few months away from actually being a member — rather, I’m the youngest possible “Gen Xer”).

The idea is pretty simple: dive into the conversation, push your ideas and your self and your self-image out there. Privacy is old school, promiscuity is the new fad. I covered this in “Your Old-Ass Values Are Broken.” It seems to work well for some people. Fred Wilson, a well known VC, has lots of readers for his cartoons of gay jokes, tales of how much he plays video games, and posts saying things like “fuck Apple”. Decorum, farewell! You have been relegated to the recycle bin of history!

When Real Grownups, like Fred Wilson, do the high-personality, low-filter thing, you end up with something like an unvarnished truth: lots of input, fairly low signal to noise ratio, and occasional obscenity or flagrancy — but in exchange, you get a measure of honesty, a personal “voice” that engages the reader, and an (imagined) human connection with the writer.

So, as I stated in “Plan Less, Write More”, I decided to do less — a lot less — planning, filtering, and proofreading, and just let it hang out. Hey Fred, wait up, I’m hoppin’ on board too!

But, there are a couple of problems with that idea.

2. I rant too much when I’m radically open.

The main problem is pretty reducible to an abstract model. Fred writes pretty much every day. So do most of the 20 or so bloggers I regularly read — generally, at least a couple entries a week. At that rate, most of the entries end up being pretty tame and moderately well thought-out, even though they have this “unvarnished” quality.

But I’ve been blogging once or twice a month on average. Why do I blog so much less than a real “blogger?” Well, because it hasn’t been a priority for me. So, my entries tend to happen when I get particularly worked up about sharing something with the world — in chemistry terms, I have a high “activation energy” for putting out a blog post, and so I only post when I’m agitated.

The effect of this, of course, is that I seem to rant a lot. If I’ve come up with a novel observation on the VC industry, or a new tech trend I think is interesting, but I’m not worked up over it, I probably won’t write about it. But if I’m having a shitty day, and some software bug or ill-considered policy really tweaks me off, then bang, I settle up the bill with an excoriating blog rant faster than you can say “Fred’s your uncle.” (Sometimes, happily, I think better of it before pushing the post out to the Web, but often not.)

So, I end up with a strong bias toward rants. Probably not the best.

3. Domain blogging would be good.

What could fix this? Well, “domain blogging” is one possibility, where I create a single blog based on one topic and really hammer on it. (I’ve tried vainly to separate things into categories here but they end up pretty spread out with no critical mass in any one.)

The problem with domain blogging in my main domain of activity — venture capital finance of early stage tech companies — is that the best and meatiest observation and analysis of the industry is the worst possible thing you can put into a public blog.

My job is all about relationship, resource, and information asymmetry. We make it our job, eight days a week, to cultivate relationships with the right people, to raise funds for our discretionary deployment, and to form proprietary opinions on market and technology trends. Then, we go around trading and arbitraging these things, like for like, and for equity in a startup, and eventually for dollars returned to our investors.

So, the meatiest things I could post here would be about those relationships, or resources, or that information. Which, of course, is like laying out a dish of dollars for all your competitors to see.

Within the world of VC, my situation is generalizable, but not universal. Back to our exemplar par excellence (sorry, Fred), there actually are some circumstances in which radical openness within the domain is a successful strategy. If you can, leveraging the Web, get a dominant mindshare among the wired crowd by means of your openness, you might cast a much larger shadow than you really have, and actually attract to yourself valuable relationships, resources, and info. But it’s a fat-tail game even within the fat-tail industry of VC, and it’s risky: it’s like shooting the moon in Hearts. Or like chopping blocks of ice with your hand. If you break through, you’re golden! But if you don’t, you’ve only managed to harm yourself in the process.

It’s probably OK for me to keep posting observations on the quirks of the industry, or purely functional / mechanical advice for newcomers, like my “VC Jargon” post.

4. Don’t shit where you eat.

There’s another issue with domain blogging, too. The more senior, and more independent, the VC blogger, the more he can get away with. Junior executives of any stripe remain, in certain ways, beholden to the norms of their seniors. (I touched on this in “VCs and the Naughty Bits.”) Even a completely independent entrepreneur, unless he wants forever to bootstrap or self-fund, can’t stray too far from the comfort zone of his investors while in the public eye. (Nobody’s smacked me down for this yet, but at this rate it’s only a matter of time until I piss off the wrong person.)

I used to think that, amongst the giants of this industry, I was like a court jester — free to say whatever I thought, or whatever might seem funny or entertaining, even if it involved the king. How could the king get upset at a mere jester? A few events I’ve been to recently have changed my mind. Do you really want to be introduced over cocktails to someone whom you’ve accused (even indirectly) of having the skill set of a “retarded chimpanzee?” Yeah, me neither. Seattle’s a small town, but guess what? Silicon Valley’s a small valley (sic), NYC’s a small metropolis — in fact, it turns out it is a small damn world, after all. The chances of me sitting next to any given F50 CEO, Senator, Rails core developer, or hedge fund manager are individually pretty small, but OR’ed together and over a few years, end up approaching p=1. Might not want to badmouth too much (even if it is sort of in good humor and mostly about the issues, not the people).

(Note that it does not escape me that this is one of the self-reinforcing traits of capitalism: every step up the ladder of wea
lth and influence that one takes is simultaneously a greater investment in the same system and a deeper barb into one’s flesh. One is less and less able to speak truth to power the higher one gets; gotta keep one’s reputation for playing a good clean game. Want to silence those upstart rabble-rousers? No need for a hit man; just give ’em promotions and fat raises.)

5. The problem with Steely Dan.

Blogs are ostensibly written for the outside world to read. The author is dying to be a star, and make them laugh, right? But we all know that really, blogs are written for the writer to write. The further out the long tail the blog is, the truer this is, until N(readers) approaches 1, the author himself.

At the peak, I had just over a thousand uniques monthly to the blog (most were RSS readers). Yay! Even I can’t go visit my own blog from a thousand different cybercafes each month, so there must have been some actual readers. But let’s make no mistake: I was getting no material (in either sense) benefit from my readership, so we can pretty much assume I was writing just for moi.

And so, predictably, I indulged myself with things like addressing the “gentle reader” and making gratuitous references to Steely Dan or Beatles lyrics. This alone isn’t a huge problem, but it doesn’t exactly help mitigate the other issues. (“Hey, this VC associate just said my developers must have ordered extra lead paint chips on their breakfast cereal before coding the UI for my product, but then he threw in a line from ‘Pretzel Logic’ in the same post. Maybe he’s not so bad after all!”) Jackass allusions are fun easter eggs when a co-conspirator spots them, but they just confuse everyone else and make them think you’re off-kilter.

6. Technical commentary is still appropriate.

Technical commentary, including bug fixes and product reviews, are still very much appropriate. I think that using adult language is still probably OK, too, although after reading the now-infamous Zed’s commentary on Rails I am rethinking just how cool it actually is to use the potty-mouth when talking about software.

7. Conclusion and next steps.

Sadly, this means I will be stripping most of the humanity and voice from the blog. Which is OK since, frankly, the “radically open ranting voice” wasn’t the best version of my voice anyhow. It also means I’m going to back and strike all the “big red words” from this little blog, or at least the most rant-a-licious parts. Sure, they’ll still be cached somewhere, so an amateur historian of the inconsequential could still see just how indiscreet I once was. But this isn’t about revoking or burying what once I said, but merely taking it off display, thus failing to renew implicitly my imprimatur.

And so now, gentle reader, this author as you have known him must say adieu. Not radically closed, quite, but back to the paleo-openness of Web 1.0 goes this blog.

Entering a Hard Line Break in a Text Cell in Excel 2004 for Mac OS X

November 12th, 2007

No cutesy commentary for once:

The equivalent on Mac OS X of alt-enter for entering a hard line break within a cell in Excel is command-control-enter (open apple-control-enter).