Errata

The Pig Head and Football Ragu

January 2nd, 2010  |  Published in Errata, Food, Thoughts

So a few weeks ago, I went to The Meat Hook to pick up a beef roast for Christmas dinner. Brent helped me pick out a nice 8 lb. roast (which he then layered with fat and tied nicely — something I don’t think I quite fully appreciated until the roast came out of the oven), and then we got down to business. I’ve been following The Meat Hook on Twitter for a while now, and these guys aren’t just dealing with your ordinary bits. They’re cranking out stuff like chorizo-stuffed duck hearts, goose rillettes, lamb belly and bahn mi dogs. That’s right, they took a Vietnamese sandwich and turned it into a sausage. HOT.

Compared to these guys, I’m clearly Mr. Amateur Newbie, so I gave Brent my 10 second charcuterie resume, and asked him to surprise me with whatever he’s got in the meat locker. He came out first with some pig’s skin, rolled it up, wrapped it up and handed it to me. I thought that might be all, but then he went back in the locker and emerged with a pig’s head.

Pig's head from @themeathook Yup, a whole head. They had already taken the cheeks out to make guanciale, but there was still plenty of meat left, so I headed for the checkout with a beef roast in one hand and a pig’s head in the other. It was going to be an interesting weekend.

I’d never cooked a pig’s head before, so I figured I’d play it safe and start with the basics, namely head cheese, which isn’t really cheese at all, more like a meat jelly terrine. I used the recipe in my copy of Fergus Henderson’s The Whole Beast: Nose to Tail Eating. And since it’s not every day that you get a whole pig’s head, I also decided to make the Crispy Pig Ear salad from the book. Both the head cheese and the crispy ears turned out pretty good considering it was my first attempt making them, but what really turned out amazing was the recipe I made with the roll of pig’s skin.

Brent told me how you could slow cook thin ribbons of pig skin in a tomato sauce and after a few hours just before the skin completely falls apart, you end up with the most delicious porky ragu you could ever want. So I gave that a shot, and it turned out awesome. Here’s a pic of the final three dishes, and below is the recipe I hacked together for the ragu.

Pigskin Ragu, crispy pig ears and head cheese.

Pigskin Ragu with handmade pappardelle, alongside Crispy Pig Ears and Head Cheese.

Pigskin Ragu (if the name weirds you out, you can also call it Football Ragu)

Ingredients

  • 1 fennel bulb
  • 2-3 medium sized leeks
  • 1 large can (28 oz.) of whole, peeled tomatoes
  • 1 roll of pigskin (about 1/2 lb.)
  • olive oil
  • salt, pepper and whatever other fresh green italian herbs you have on hand (e.g. parsley, thyme, rosemary)

Directions

Thinly slice the pig’s skin into strips about 1/8″ wide and 1″ long. Saute in a pan with a little olive oil over medium heat for a few minutes just to heat them through and to brown the outside a little. Now open the can of tomatoes and strain off all of the tomato juice into the pan with the pig’s skin. Add a little bit more water if the pigskin isn’t fully covered. Turn the heat down to low and let this simmer for about an hour.

Meanwhile, thinly slice the fennel bulb and leeks. Saute in a stock pot with a little bit of olive oil on medium heat for about 5 minutes until they’ve sweated some. Coarsely chop the canned tomatoes, and then add them to the pot. Turn the heat down to very low and let simmer. You don’t want the pigskin or the tomato mixture to boil, so just keep them low and slow for the next hour.

After an hour of simmering, pour the pigskin/tomato juice mixture into the pot with the leeks, fennel and tomato. Add whatever fresh herbs you want and stir everything together. Continue to simmer for another hour, tasting and seasoning as you like, just be careful that if you simmer the sauce much longer the pig skin will start to completely melt. Personally, I stopped cooking the ragu just before this melting point so that there was still some texture to the finished ragu. But if you don’t like that, just keep simmering and the texture will melt away, but the flavor will remain.

Once the ragu is done, serve with your favorite pasta. In my case, I just threw together some handmade pappardelle using the 3:2 Pasta Dough from the Ratio iPhone App. Delicious.

Ratio for iPhone and iPod Touch

December 15th, 2009  |  Published in Development, Errata, Mobile, Ratios, Releases

So for the past few months, I’ve been working with food writer Michael Ruhlman on the iPhone adaptation of his cookbook “Ratio”. Well pop some bubbly, cause the app is now live in iTunes!

Purchase Ratio for iPhone and iPod Touch

Picture1

Picture2

An open challenge to the customer service departments at American Airlines and Japan Airlines

December 6th, 2009  |  Published in Errata, Travel

Dear American Airlines and Japan Airlines.

This week I flew in business class from JFK to Singapore and you lost my luggage. The luggage was not delayed or misrouted, it was completely LOST.

Twelve hours after I landed in Singapore, there was still no sign of my bag, so I had to go out at my own expense and buy new business attire for my three days of client meetings.

For the next several days, I called both Japan Airlines and American Airlines twice a day to determine what happened, and neither airline could locate my bag. All they could tell me is that my bag tag number (403648) was cancelled at JFK before the plane took off and no one has seen the bag since. I find it hard to believe that in this age of heightened security, a bag can just be cancelled after check-in and disappear that easily, but this is what you’re telling me happened.

One week has passed, I’m now back in NYC from my business trip, and no progress has been made. The bag is probably gone for good, but what upsets me even more is that neither airline is taking responsibility for this and are pointing fingers at each other. Japan Airlines says that American Airlines never put the bag on my flight from JFK to Narita, so it’s American’s problem and I need to follow up with American. American Airlines says that since my final destination in Singapore was on Japan Airlines (apparently it doesn’t matter that it was an AA flight number), then I have to resolve this myself with Japan Airlines. I’ve talked to representatives at both airlines in their company wide 800 numbers, at the local offices in JFK and Singapore, and even to the Executive Platinum desk at American, and no one has an answer, just another number for me to call that eventually circles back around to where I started.

I’ve spent enough time calling people and filling out forms. I’m done. This needs to be resolved immediately. And I’m going to give you one last chance.

I’ve tried going through your channels, but that’s not working so I’m challenging you to resolve this here online. I’m giving you the chance to show the world your commitment to customer service. I fly your airline a lot (100K miles this year, 1.1 million in my lifetime), and I know the airline industry has taken a beating in this economy. I’m not here to berate you more. I want you to succeed. That’s why I’m giving you this opportunity. Don’t let me down,

-Will

UPDATE #1: The automated email system from American Airlines notified me that a file number was created. I2009/12-05761-00011-001-00. No contact from a real person though.

UPDATE #2: American Airlines has responded! They took the time to write me a long letter from their customer service department saying that Japan Airlines is responsible and that I need to follow up with them. Yes they did….

Happy Birthday Bar Code

October 7th, 2009  |  Published in Errata, Mobile, Thoughts

A lot of people find this blog because of my articles on mobile bar codes, so I thought I would mention Google’s spotlight today celebrating the 57th birthday of the bar code. In case you miss Google.com today, here’s a screenshot.

Pretty sweet.

BarCampNYC4

May 7th, 2009  |  Published in Development, Errata, barcampnyc, transparency

barcampnyc4

May 30-31 is BarCampNYC4. Register now as slots are disappearing quickly.

I’m putting together something to talk about RepresentedBy and its future development roadmap. Will anyone else be working on something around open government, or technology for change? Would love to assemble a group session on this.

Are digitally transparent legislators less likely to include earmarks?

March 17th, 2009  |  Published in Development, Errata, Thoughts

For the past two months, I’ve been developing RepresentedBy, a Facebook application created for the Sunlight Labs Apps For America competition. During the two months of development, I’ve immersed myself in the online government world and while I’ve been exposed to quite a lot of great work by passionate individuals, I’ve also realized how little of Congress is digitally transparent.

Digitally transparent can mean a lot of things to different people, so in an attempt to quantify that, I’ve developed what I’m calling the DTI, or Digital Transparency Index. This is a number between 0 and 115 that gives you a rough idea of how engaged a legislator is in the digital world. Legislators are scored on the following criteria:

  • 25 points if they have a public facing email address
  • 20 points if their website has a valid RSS feed
  • 10 bonus points if they’ve posted a news item to their RSS feed in the past week, 5 bonus points if they’ve posted a news item to their RSS feed in the past month
  • 20 points if they have an active Twitter account
  • 10 bonus points if all of the tweets on their home page are from the past week, 5 bonus points if all of the tweets on their home page are from the past month
  • 20 points if they have an active YouTube account
  • 10 bonus points if they’ve posted a YouTube video in the past week, 5 bonus points if they’ve posted a YouTube video in the past month

The sad truth is that Congress isn’t as digitally immersed as a lot of us. Out of 115 possible points, the highest score anyone received was an 85. Worst of all, out of 451 active legislators, 209 of them scored a big fat zero, 161 legislators scored low (meaning an index of 35 or less), and only 81 legislators scored 40 or higher.

digital immersion # of legislators
none 209
low 161
medium to high 81

My first assumption was that this gap was an age related issue. The average age of Congress is around 60 years old which isn’t exactly the average age of of your cutting edge Internet user. However, I compared the results of the Digital Transparency Index with the number of years that someone has been in Congress and didn’t notice any obvious trends implying a difference based on age. Here’s a graph showing the results.

The far right of this graph indicates highly engaged digital legislators, and the far left of the graph indicates poorly engaged digital legislators. Aside from the large number of legislators who are not digitally engaged, when you start looking closely at highly engaged digital legislators, there’s not a huge disparity between the number of new, younger legislators engaging digitally and older, veteran legislators engaging digitally.

Next, I wondered if there was a connection between digital transparency and earmarks. Taxpayer.net recently released information about active legislators and the earmarks they have included in the 2009 stimulus package so I compared the amount of solo earmarks included by each legislator with their Digital Transparency Index, and graphed the results:

While there is a disproportionately large number of legislators who are not digitally engaged and who have not sponsored large earmarks, you’ll notice that as digital engagement increases, there becomes fewer and fewer legislators who are sponsoring extremely large earmarks. The only exception to this rule is Nancy Pelosi who has a very large Digital Transparency Index (80), but has also sponsored a large number of solo earmarks ($15,667,000).

Is this a trend? Does being digitally engaged and having real-time communication with your constituents discourage legislators from sponsoring earmarks? Or is it the opposite and legislators who don’t support earmarks on principle are more likely to take that message directly to the people and engage with them digitally?

Here’s a table summarizing my findings.

digital immersion # of
legislators
avg solo
earmarks 2009
avg years
in Congress
none 209 $5,226,898 15.8
low 161 $6,366,649 16.1
medium to high 81 $4,069,291 15.1

If you want to see where your legislator falls on either of these graphs, then check out RepresentedBy, a Facebook application I’m creating which includes this information and personalizes it to your specific district.

Finally, I hope to develop the Digital Transparency Index some more, so if you have any comments or suggestions on how to improve it, then please include them in the comments.

RepresentedBy Facebook app launches public beta

March 5th, 2009  |  Published in Development, Errata, Releases, Thoughts

My last entry about Google AppEngine and Facebook Applications was written during the development of RepresentedBy, a Facebook application which is still in a rough beta state, but has finally been opened up to the general public.

The goal of RepresentedBy is to:

  • To increase civic engagement.
  • To increase personal awareness of the legislators representing you in Congress and how they are voting on important issues.
  • To share information about your representatives with your friends, and to encourage civic engagement among your peers.
  • To provide an open source learning template for Facebook applications developed with Google App Engine.

The app is still in beta, but once it’s ready for release sometime in late March, then the source code will be made available. In the meantime, please check out the application and let me know what bugs you find, and any problems that you encounter.

Google AppEngine and Facebook Applications – 10 Things I wish I had known

March 1st, 2009  |  Published in Development, Errata, Thoughts

For the past six weeks, I’ve spent some of my spare time learning about Python, Google AppEngine and how to create Facebook applications with them. In a few weeks, I’ve learned a thing or two the hard way and thought I would share some lessons learned to save other developers from beginner’s frustration.

1. Never exceed 1000

When working with AppEngine, it’s good practice never to exceed 1000 in anything you’re doing. You name it, this rule applies. For example:

  • Your application can’t have more than 1000 files.
  • Each file can’t exceed 1000K (this includes third party libraries).
  • Each page needs to render in under 10000ms.
  • Database queries might not return more than 1000 results.
  • Each data structure in memory shouldn’t exceed 1000K
  • Each object stored in memcache can’t exceed 1000K
  • and so on….

Before you choose to build an app with AppEngine, make sure you can accomplish what you want to do within these limitations. It might make sense to only use AppEngine for part of the whole project (e.g. AppEngine for processing and Amazon S3 for storage).

(**UPDATE** Google recently upped some of these AppEngine limits, but not for everything)

2. AppEngine forces your code to scale out, not up

When I first heard about cloud computing and scalable infrastructures, I thought it meant giant supercomputing clusters which can handle massive amounts of processing and calculations.

AppEngine isn’t like this at all. It’s designed from the ground up to be scalable, but it achieves this by doing hundreds of thousands of small tasks instead of tens of really big tasks. And your source code needs to embrace this philosophy. If your script needs to spend time processing thousands of records, you should re-think why it has to be one script instead of ten smaller ones.

Switching my brain to architect for AppEngine was the hardest part of AppEngine development, but once I got into the groove, it makes total sense. I’ve really enjoyed building my applications from the ground up with scalability in mind. I might not be as open minded if I had to port and existing application to AppEngine, but luckily, I haven’t had to do that yet. ;)

3. Use DynDNS to develop AppEngine/Facebook apps locally

AppEngine imposes a daily quota of 250 deployments to their server. This limit seems reasonable, but often you’ll need to test your Facebook applications in Facebook itself. And if you’re tweaking CSS or troubleshooting bugs, then you can use up your quota quickly if you have to deploy a new app each time you want to test a change in Facebook. If you use up all your deployments for the day, then you can’t upload anymore and have to stop development until the quota resets in 24 hours.

This has happened to me twice now, and after the second time, I found a great thread in the Developing for Facebook + Google App Engine group describing a solution for using DynDNS or similar service to give a domain name to your local PC, then pointing your Facebook app at your local computer. That way you can test the application on Facebook.com using your local AppEngine devserver. Trust me, this is worth the setup time.

4. Be prepared to dig in, tweak and modify Python libraries

There’s a lot of great Python code libraries out there, but much of it doesn’t work with AppEngine because of AppEngine’s unique webapp framework. You can get most libraries to work with AppEngine by adding a line or two of custom code, but you have to be willing to dig into the code and fix it.

For instance, I’m using the Google YouTube API, and in order for it work with AppEngine, you need to override the http_request_handler like this:

import gdata.service
import gdata.urlfetch
gdata.service.http_request_handler = gdata.urlfetch

Another example is custom template tags. You need to register your custom tags with AppEngine’s framework:

register = webapp.template.create_template_register()

And then in each of your individual scripts you need to register the library. So for a library named ‘customtags’ it would be:

webapp.template.register_template_library('customfilters')

w00kie has a good blog entry talking about this in more detail, but don’t expect a lot of existing Python libraries to be completely plug-n-play with AppEngine.

5. There is never too much error detection

When a user visits your URL on Facebook, Facebook will call the URL on AppEngine, AppEngine will use its framework to get data from the Internet, from its DataStore, and from Memcache, then return the result to Facebook which processes the FBML and displays the content to the user.

Unfortunately, just about anything can go wrong. I’ve had Facebook authentication fail even though you’re logged in, I’ve had Facebook give up on waiting for AppEngine to render its page, I’ve had AppEngine throw errors when doing a simple urlfetch, and I’ve had third party APIs suddenly stop responding. These errors are rare and normally not reproducible, but you still don’t want your user trying to figure out what an "ApplicationError 5" means. , So write your code to handle lots of exceptions.

6. FBJS is your friend and is key to achieving scalability in Facebook apps on AppEngine

The home page of my Facebook app is a beast. The content you see on the home page comes from more than 30 URLs on 10 different domains and third party APIs. Waiting for AppEngine to download and render this content takes forever, but I was able to pull it off by breaking up the page into five separate pieces. There’s a shell page, and then within that shell page there are four modules which each use FBJS to make a separate AJAX call to AppEngine to retrieve and display their own content.

I’ve learned the hard way that putting all your code in one page can take forever to render and consume lots of CPU, and FBJS helps reduce spread the page load out across multiple scripts.

7. Debugging FBJS is a real pain

While FBJS helps you scale out, debugging FBJS is a real pain. First, it only warns you of syntax errors, so if you have a logical error your script fails without warning. Facebook doesn’t report errors to the browser or allow you to use alerts, so the only solution I’ve found so far is to comment out your JS code one line at a time until you find the trouble spots. I would only advise doing this if you’re developing locally, otherwise you’ll quickly run into your quota limit for daily uploads to AppEngine.

8. If you’re retrieving external content, memcache is your best friend

As I mentioned earlier, the home page of my Facebook app gets most of its content from external URLs. For each URL, you fetch its content, process it into a native Python object (list or dict), and then render the content out via a template. This can eat up your CPU hours, reduce your response time, and make users give up on you.

Using memcache fixes all this. Memcache can store native Python objects, so once you’ve parsed a URL’s content in a native format, store the native object directly in memcache and retrieve it next time a user needs content from that URL

9. Use cron jobs to keep memcache current

Using memcache speeds up response time for all users except your first user. Since you shouldn’t be treating your first user any differently than the others, it’s worth setting up a script that keeps memcache refreshed with external content. This way all users will benefit from the speedup of memcache.

In my Facebook application, I’m retrieving content from a pool of around 3,000 different URLs, so I have set up a script that randomly picks 3-5 of these URLs, retrieves their content, and stores the result in memcache. I’ve also setup a cron job to call this caching script every minute or so and it’s sped up the average response time of the page, because the server never has to go out and retrieve 30 URLs of content at once. Also, if you are using third party APIs that put a limit on your usage, this is a great way to ensure you stay under those limits.

Right now, I’m executing the cron job from my own webserver, but AppEngine has said that cron support is on their roadmap, so hopefully in the future you’ll be able to support this entirely from within your AppEngine setup.

10. Once you’ve built an app or two with AppEngine, you’ll either love it or hate it.

I’ve really enjoyed developing apps with AppEngine, but I will admit it’s not for everyone. Anyone needing to do a lot of heavy data processing, or handle incredibly large data sets will experience nothing but frustration with AppEngine. However, for the majority of online projects, it’s a great way to build something scalable quickly, making it ideal for Facebook applications.

My first major Facebook application should be ready for public beta in the next week or two, so I’ll keep you posted about its progress.

Integrating Social Search within Web Search

December 4th, 2008  |  Published in Errata, Mobile, Thoughts

I spent the past two days at the Gilbane 2008 conference in Boston, and while I came away with some good information and had some good conversations with people, these conferences remind me how frustrated I get when people talk and talk and talk instead of demonstrating, showing, and using specific examples. I heard too many people say “well, that’s what young people are doing on Facebook,” when I would have found it much more useful if they’d opened up a browser and shown me real content, real people, real applications and real usage patterns.

Better yet, just make the whole thing a BarCamp.

But for all the talk in the sessions about the importance of Social Media, I’m curious why more sites aren’t doing mashups that integrate general web search results with search results from your own social network. Someone should build an OpenSocial container with a Google search bar in it, and in the results you could include recent status updates from your friends that include similar search terms.

Here’s an example. At the conference, FatWire was presenting a demo of its software during a keynote and thought it would be funny if they used “sanitized” images from Playboy. The audience was not amused and promptly let them know about it.

So how does this incident show up in search results? Below are some dynamic AJAX results comparing Google News and Google Blog search results for “gilbane fatwire” with the exact same search results from Twitter. I’m sure these results will change over time, but for now it’s a concrete example of how integrated search results can help you connect with the right information AND the right people.

[raw_html]

Searching for the term ‘gilbane fatwire’…

 

[/raw_html]

Dear Google, you missed your chance

November 6th, 2008  |  Published in Android, Errata, Mobile, Thoughts

Yesterday I was riding the subway in NYC and saw something I had never seen before — a print advertisement for Google maps.

11/06/2008

In true Google fashion it was a simple ad with a clear message saying you could use Google Maps on your phone. BUT THERE WAS NO QR CODE. C’mon Google, you clearly missed an opportunity here to show people the power of bar codes and you just dropped the ball entirely. There are so many other aspects of your business that are promoting bar codes — the launch of Android and the G1, your own open source bar code reader, and your in depth education about bar codes when trying to sell print advertisement.

Yet when you’ve finally given the opportunity to demonstrate the power of bar codes, test them in a public mass market environment and start collecting real data about how people are or are not using them, you just didn’t even take the chance.

I’m really disappointed.