« | » Main « | »

Tabblo valentines

Wednesday 31 January 2007

One of the things we are trying to do at Tabblo is to bridge the gap between sharing photos online and sharing photos physically. Sites like flickr and BubbleShare are purely about photos online. Sites like Shutterfly and Ofoto are purely about printed products.

We're trying to find a good balance between the two worlds, letting you share photos online, but also turn them into great physical products. One of the themes we're exploring is how to make the creation of physical photos easier and lighter-weight.

This week we put up Tabblo Valentines, quick little cards that you make online, and then we mail to your friends, for only $1 each, including postage. That's a really good deal, as you'll know if you've ever bought cards in a store, and these aren't corny sentiments written for you, they're your pictures and words.

A valentine for my sweetie!

As social networks give us new ways to connect people, and to show photos on the web, we're really interested to also find new ways to make permanent versions of these photos. Tabblo Valentines are a little step in that direction.

EURIon constellation

Sunday 28 January 2007

On the back of the US $20 bill is a strange pattern of "20" numbers. They are yellow, which is odd for the overwhelmingly green bill, and they seem to be randomly placed. Unlike the rest of the bill, which uses randomness as a way to tight pack an area, the back seems sparsely dotted with these yellow numbers. It has the whiff of having some other purpose.

Turns out these numbers are part of the EURion constellation on the bill. The zeroes are circles in a specific geometric arrangement that allows for detection of moneyness (to coin a term, har!) by copiers and software like Photoshop, which refuses to open scanned images of money.

Except it seems that software doesn't use the EURion constellation. The linked page demonstrates all sorts of clipping and manipulation of money images, some of which are detected as money, and some of which are not. The EURion constellation being part of the image seems not to be correlated to detection. Interesting.

There must be all sorts of fascinating algorithms at work to detect bills from many countries in many denominations...

Wikipedia and nofollow

Tuesday 23 January 2007

One of the techniques I mentioned off-hand in Stopping spambots with hashes and honeypots was to mark all out-going links with rel="nofollow" to negate the search engine incentive to spammers putting links in your comments. Turns out Wikipedia has just turned this on for all their outgoing links (I think: the announcement was pretty terse, and actually makes it sound like a temporary measure).

When a small-time blogger does this for their comments, it's no big deal. But when Wikipedia does it, it is a huge deal. Wikipedia is an 8000-pound gorilla in the Pagerank ecosystem. A change to how they treat their external links will make waves. Naturally people are debating the issue.

Aside from all of the web-societal implications, the debate is exposing some new ideas: Google Blogoscoped mentions the idea of a "fading nofollow": links start with a nofollow attribute, and then over time, lose it. The idea is that spam links will be found and removed, and will not get a chance to age to the point that they lose the attribute. Over time, most links will lose the nofollow, so the site as a whole will contribute to the search engines rankings, while spam links won't survive past their probationary period. Clever.

Stopping spambots with hashes and honeypots

Sunday 21 January 2007

Up until about six months ago, I was preventing spam on this site using a keyword list. As new spam would arrive, I would update the list to prevent it. It was a pain. Six months ago, I changed my comment form to use a number of tricks to make it difficult or impossible for a spambot to successfully post a comment. In that time, I have had 450 real comments, five spam comments (almost certainly by people), and perhaps 2500 failed spam attempts. That is a good ratio.

I've written up how I do it: Stopping spambots with hashes and honeypots.

Last week, Damien wrote Negative CAPTCHA, about fooling spambots into identifying themselves with invisible fields. This is a component of my technique, so his post spurred me to explain what I do to keep spam off this site.

I was particularly interested in the comments on Damien's post, as they show the variety of know-it-alls that boldly proclaim facts that are plain wrong, or miss the point.

For example, about the possibility of spambots properly parsing forms with invisible elements, Guymac wrote:

It's a simple DOM method call to determine if an element, say a form field, is visible or not. So Bot writers could trivially work around this technique.

I was amused by his use of the word "trivially", since it neatly glossed over the need to base the bot on a browser infrastructure, and ignored some of the ways that fields can be made invisible.

My technique works well on this site. Maybe by writing it up, we can get some more good ideas flowing. I picked up some tips from commenters on Damien's post that I have now integrated into my system.

The Fitful Flog

Thursday 18 January 2007

One of the unexpected benefits of my How to make business card cubes page is that the people who link to it also link to similar cool stuff. In this case, the serendipitous find is The Fitful Flog, an origami blog by Philip Chapman-Bell.

He's got great geometric models, complete with diagrams and photo how-to's. It's a lot more complicated than business cards, but also much more beautiful.

And while we're on the topic, here are some more paper folding links:

Color parsing brainteaser

Thursday 18 January 2007

I was experimenting with HTML color names the other day. This HTML snippet:

<p><font color='red'>&#x2588; RED</font></p>

got me some red text:


(I'm using the Unicode FULL BLOCK 2588 character to get a solid swatch without having to worry about antialiasing effects). Adding a less well-known name got me another color:

<p><font color='red'>&#x2588; RED</font></p>
<p><font color='seagreen'>&#x2588; SEAGREEN</font></p>



What if the name had a space in it?

<p><font color='red'>&#x2588; RED</font></p>
<p><font color='seagreen'>&#x2588; SEAGREEN</font></p>
<p><font color='sea green'>&#x2588; SEA GREEN</font></p>

To my surprise, the "sea green" line was blue! It seems the color name parser in your typical HTML browser is very forgiving, just like the rest of HTML interpretation. Given a nonsense string like "sxbxxsree", it will decide that some subset of the characters indicate a color, and it will use them.

I played around with more randomized color names, and ended up with a brainteaser on my hands: how exactly does the browser interpret these bogus color names? Note that IE and Firefox don't agree, though they are close.

I can't show the effect inline here, because the bogus colors have no effect if the page has real color specifications someplace else, so have a look at the results in a separate page.

Here's what different browsers show:

red█ #ff0000█ #ff0000█ #ff0000
seagreen█ #2e8b57█ #2e8b57█ #2e8b57
sea green█ #0e00ee█ #0e00ee█ #0ea00e
sxbxxsreen█ #0000e0█ #0000e0█ #00b000
sxbxxsree█ #00000e█ #0b00ee█ #00b000
sxbxxsrn█ #000000█ #0b0000█ #00b000
sxbxeen█ #000e00█ #0bee00█ #00b0ee
sreen█ #00ee00█ #00ee00█ #00ee00
ffff00█ #ffff00█ #ffff00█ #ffff00
xf8000█ #0f8000█ #0f8000█ #0f8000

At least in the case of Firefox, I could go digging into the source to try to find what it is actually doing, but it is a head-scratcher. Clearly, it is interpreting the accidental hex characters, but how does it decide which ones to use where?

This is one of those fascinating cases where a black box reveals something of its insides through how it behaves when broken. Neurologists study people with head injuries for similar reasons!

Five things you didn't know about me

Saturday 13 January 2007

Damien tagged me with a blog meme to tell five things people don't know about you.

  1. I grew up in Manhattan. Many people can't understand raising kids in a city, but I thought it was great. I got around the city by myself on the subway, or by just walking a lot.
  2. I didn't have a driver's license until after I was married. This is partially a result of #1.
  3. As a teenager, I attended Farm & Wilderness, a Quaker camp in Vermont. I think it contributed a lot to my personality, and taught me the value of sincerity.
  4. My real name is Edward. No, I don't know where the N comes from. Ever wonder why Senator Edward Kennedy is called Ted? These things just happen. I am named after both of my grandfathers, who were both Edwards, but my mother hated the nickname Eddie, so she started me off with Ned, and it has served me well.
  5. The backs of my hands have a number of small scars where my autistic son has scratched my hand in anger. I'm of two minds about this: it bothers me a lot when it happens, but I am also proud of the fact that I stay in his face anyway.

Ubuntu cookies

Thursday 11 January 2007

You'll never guess how this post turns out. It's got nothing to do with browsers. Joseph Hall shows us how to make sugar cookies imprinted with the Ubuntu logo. And not imprinted as in decorated with icing, or cut with a cutter. No, he's gone whole hog and formed a log of multi-colored dough so that the cross-section is the logo! And if that isn't enough, he's also made Tux cookies. My hat is off to him! Mmmmm, geeky sugar cookies...

Python assignment trickiness

Wednesday 10 January 2007

Here's a well-known fact about Python assignment: When you have a list (or tuple) on the left-hand side, and a list (or tuple) on the right-hand side, each element on the left is assigned a value from the right, just as if it were in its own assignment statement:

>>> a, b, c = 1, 2, 3
>>> a, b, c
(1, 2, 3)
>>> [a, b, c] = (1, 2, 3)
>>> a
>>> b
>>> c

So far, I don't think anyone is surprised by this. But notice the recursive nature of the definition. This means that an element on the left can itself be a list (or tuple):

>>> a, (b, c, d), e = 1, (2, 3, 4), 5
>>> c
>>> a, _, e = 1, (2, 3, 4), 5
>>> e

This can be helpful with functions returning multiple structured values:

def points():
    ''' Return two pairs of numbers. '''
    return (x1, y1), (x2, y2)

# Now I can call points and unpack it flexibly in the same statement:
a, b = points()
(ax, ay), b = points()
_, (bx, by) = points()
(ax, ay), (bx, by) = points()


Wobbly tables

Tuesday 9 January 2007

At dinner the other night, our table wobbled. While the waitress fetched a wedge to stabilize it, I told my fellow diners about an applicable mathematical proof: If the legs of a table are even, but the table wobbles because of an uneven floor surface, then rotating the table will always find a position where all four legs are touching the ground.

They were skeptical, but it is true. The ground must be continuous, in the theory of functions sense: no cliff-like changes in height. As proof, here's an intuitive thought experiment, and the same concept, but full of mind-bending rigor which I don't understand.

CampaignMonitor blog

Monday 8 January 2007

I received an email newsletter from Technorati, and noticed the links were redirecting through cmail1.com. I looked at the domain, and got a generic web server error message. Searching with Google led me to Campaign Monitor, a company in the business of running email marketing campaigns. Unremarkable, except that they have a really good blog covering all sorts of issues around sending HTML emails.

Now I know that this is a controversial topic, not just marketing via email, but even the existence of HTML emails. But I am often in the business of programmatically sending information in emails, and it can be a complicated business. I appreciate the care with which Campaign Monitor has shared some of their knowledge. If you find yourself scratching your head about the different ways that Gmail and Yahoo scramble your CSS (for example), you will like their blog.

XUnit patterns

Monday 8 January 2007

Martin Fowler has updated his Mocks Aren't Stubs article. It looks like a good introduction to a deep understanding of mock object testing. I was particularly struck by the definitions of dummy, fake, stub, and mock objects:

  • Dummy objects are passed around but never actually used. Usually they are just used to fill parameter lists.
  • Fake objects actually have working implementations, but usually take some shortcut which makes them not suitable for production.
  • Stubs provide canned answers to calls made during the test, usually not responding at all to anything outside what's programmed in for the test.
  • Mocks are objects pre-programmed with expectations which form a specification of the calls they are expected to receive.

I'd never heard this distinction, but it is a good one. Fowler attributes it to Gerard Meszaro, who it turns out is writing a book about patterns within test development, xUnit Patterns. The whole book is available on the website (for now), and looks like a good compendium of practices and ideas in test developement.

I continue to work on how to best incorporate testing into real-world projects. The pressure of time, and the compexity of large systems, both conspire to make testing a real challenge. So I'll be looking through the xUnit Patterns to see what it can add to my understanding.

SpaceMonger v2

Sunday 7 January 2007

I first wrote about SpaceMonger about two years ago, and mentioned at the time that a shareware version was coming. My disk was down to less than 2Gb free today, so I was about to spark up the trusty old SpaceMonger to find out what was taking all the space, when I decided to look into what had become of its promised follow-on version.

I downloaded SpaceMonger 2.1, and was not disappointed. There's a common problem among shareware products: the author starts out by building a simple product, but then wants to add features to make it interesting enough for people to buy it. But rather than extend the utility of their utility, they simply slather on as many configuration options as they can. So what started as a small program remains a small program, but with a huge options dialog.

SpaceMonger also has many configuration options, some of which seem a bit gratuitous, but it is clearly a leap beyond SpaceMonger v1. Version 1 felt like a proof of concept, version 2 is much more usable, adding a number of new ways to see your disk usage. It's also very nice looking (apart from the themed UI, which refuses to look like the rest of my desktop). At $20, it's well worth it.

Vim help

Saturday 6 January 2007

I find myself using vi (often vim actually) a lot these days, not for large chunks of code, but for small scripts and configuration files on a variety of Linux servers. You can get along in vi using just the hjkliESC keys, but sticking with those is really limiting. I'm getting to the point where I remember to use other commands, and so it's time to read again about all the vi commands, and try to increase my repertoire. These two references look useful:

I can't quite explain why vim feels like my editor of choice for these sorts of occasional edits on Linux: I guess because it's ubiquitous and a little familiar.

Brand new

Saturday 6 January 2007

Brand New is a specialized blog, even within the niche of design blogs. It covers only corporate identity topics, especially re-brandings. Judging from the recent entries, there's no shortage of topics to cover. I was interested to read the latest, about the new Saks Fifth Avenue identity program. It's a clever use of an old logo with a new geometric treatment.

Busy christmas

Friday 5 January 2007

Things have finally settled down at work from the Christmas season. One of the reasons I was eager to take the job at Tabblo was to work on a consumer-facing product for a change. As I put it in a (perhaps ill-considered) comment during my interview process:

I know all the ways enterprise software sucks — I want to learn how consumer software sucks

What I meant was,

I'm familiar with all of the challenges involved in building successful enterprise software, and I'm kind of tired of them. I'd like a chance to learn about the challenges unique to consumer software.

Yes, I really said the first one, and yes, the second one would have been much wiser. But I got the job anyway, and for the past year I have been learning about consumer software. One of the things I've learned is: Christmas is busy.

Not only is Tabblo consumer-facing, but we sell real products, and ones that make good gifts, so we had a huge increase in orders in December, as anyone who's traveled down this path could have told you. Add to that that we had only just recently launched our book products, and you have a very hectic holiday season indeed.

But we shipped a lot of books, and all helped out in the factory, and shipped stuff, and got to play with the barcode guns, and so on. I especially enjoyed the book manufacturing process, both the software creation to produce printer-ready files, and the actual manufacturing. There's something very satisfying about working with paper, and holding a finished product in your hands.

Things are now beginning to get back to normal, where my job is mostly about planning features, writing software, triaging bugs, and so on.


Monday 1 January 2007

As they do every year, the language kvetches at Lake Superior State University published their List of Banished Words (that's actually the current list, there is no permanent URL for the 2007 list, which will probably be here someday). One of the banished words this year is "awesome".

Their reason for banishment is that the word is used indiscriminately for all sorts of out of the ordinary situations. Its meaning has also changed: it used to mean inspiring awe, but now merely means really good.

But this is not unusual. In fact, it seems to me that most of the words we have for "really good" used to have more specific meanings: great, terrific, fabulous, wonderful, amazing, brilliant, fantastic, magnificent, excellent. I don't know if this is unusual to English. All of the words available to us for expressing extreme delight have very specific meanings lost over time as the word is used to exclaim about what pleases us most.

We could certainly choose our words more carefully, find more precise and unusual adjectives to express ourselves. In writing, I'm sure you'll find far fewer uses of "awesome" than you do in everyday speech. But using "awesome" as the current best word for best isn't bad. It's just language evolving, as languages do. Awesome!


Monday 1 January 2007

I was reading a story from Google News: Spitzer Swearing-In Ushers in New Era in New York Politics, and I noticed two words double-underlined in green. Hovering over them activated a pop-up window which allowed me to search the web for the term via Windows Live. It was both obtrusive (double-underlining a word makes it a blot on the page) and silly (the two terms underlined were far too generic to be interesting searches: Republican and Governor). Oh well, I chalk it up to a bone-headed site, and move on.

The very next story I read, The Controversy over Microsoft's Gifts to Bloggers, was on a different site, but had the exact same double-underlined text. This time, there were seven words blotted, and the pop-up window clearly identifies itself as an ad. Now I have to look into it.

The boxes are branded as IntelliTXT, and have a little question mark button. Clicking it takes you to a page explaining their "ad unit" technology. Of course, before it explains anything, it helpfully (NOT!) resizes your browser window. Interestingly, depending on how you got to the page, it offers a link to disable IntelliTXT. From Fox News, the page has the link (and clicking it does turn off the double-underlining). From the Playfuls page, there is no disable link.

Ads just are, I guess, and at least for some sites, IntelliTXT can be disabled. Judging from the two instances I saw, though, I don't think it will be around for long. It's too distracting, and not very useful, even to the advertisers.

Update: Just by coincidence, I sighted IntelliTXT on a third page: What if they Released a Movie and Nobody Came? Or maybe these green double-underlines will start appearing everywhere?

« | » Main « | »