Archive for April, 2007


Several years ago, I decided to try my hand at making salsa. The experiment was a success, however, the notes I made on how I made it were promptly lost. Months later, I tried again. I made another satisfactory batch of salsa, took good notes, and lost them again. Since then, I’ve made salsa on a number of occasions, ballparked it each time, and gave up on writing it down. A couple days ago, I made a batch, and decided to document the recipe while it is still fresh in my memory.

Before I get to the recipe, a few notes. The reason I decided to make my own salsa in the first place is that I don’t care much for supermarket salsas available in jars. These products are too wet, containing much more liquid than vegetables, and are often too sweet. I like fresh salsa, full of lots of fresh vegetables, and not a lot of liquid. These days, you can often find decent fresh salsas in the produce or deli section of the supermarket; when I first tried this recipe, this wasn’t the case. Fresh salsas which I’ve enjoyed from the local megamart include Rojos, here in the greater Philadelphia area, and Sister’s Salsa, found in Maine.

I’ll also note that this salsa recipe is a work in progress. I’ll probably make some adjustments next time; I’ll discuss some of these after the recipe. I’ll also add that my taste runs to medium-hot or less, if you like your salsa rocket hot, you’ll want to crank up the fresh hot pepper content, and possibly adjust the seasonings as well.

Fresh Salsa Recipe

  • 4 cups Roma tomatoes (approx 12-14 tomatoes)
  • 2 cups finely diced onion (I like 1/3 red onion and 2/3 Vidalia)
  • 2 cups diced orange and yellow bell peper (1 large of each)
  • 2 medium jalapeño peppers, seeded and finely minced
  • 1 tbsp paprika
  • 1 1/2 tsp salt
  • 1 tsp white pepper
  • 1 tsp chili powder
  • 1 tsp cayenne pepper
  • 1/2 tsp dried cumin
  • 2 tbsp apple cider vinegar
  • juice of 1/2 lime, freshly squeezed

To prepare the tomatoes, slice each lengthwise into quarters. Using a teaspoon or grapefruit spoon, remove any seeds and inner membrane from each quarter, leaving only the outer flesh of the tomato. Dice. Combine all of the vegetables in a large bowl.

Combine the salt and all of the dried spices in a small bowl and mix thoroughly. Sprinkle about half the mixture over the vegetables and toss. Cover and refrigerate for 8 to 12 hours.

Remove the salsa from the chill chest and stir well. Have a taste, but take note… the salsa isn’t really done yet. You just need to decide how much more of the seasoning mixture to add. I usually add about half the remaining mixture, holding the rest in reserve. Toss again to combine, and add the cider vinegar and fresh lime juice. Refrigerate another 12 hours. You can serve it now, but it improves with age- it’s really good after a total of 48 hours fridge time.

Its worth noting here that I’ve never quite gotten the seasoning nailed down. I always make approximately 3 tablespoons worth, and add it a bit at a time, sampling as I go. The first couple times, it always seemed too hot at first tasting, so I needed something to reduce the heat. I found that a tablespoon or two of apple cider vinegar seems to fit the bill. At a later tasting, I end up adding more seasoning anyway, so I’m sure there’s more tinkering to do. The lime juice was a new addition this time around, as I had limes on hand for adding to Corona, and I think it added a bright note. Next time I may try the juice of a whole lime.

For those watching salt intake, I’d suggest that the salt in this recipe is necessary. The salt draws moisture out of the vegetables, allowing them to soften slightly, and helping the flavors to mingle. Also, 1 1/2 tsp (or less, depending on how much seasoning you end up using) in about 8 cups of salsa should work out to a reasonable amount per serving.

One of these days, I’ll make a full batch of vegetables, split it into 4 batches, and try a few variations on the seasoning concurrently, to try and nail the recipe down. The other thing I want to try is to use some fresh herbs to help shape the flavor, perhaps with less dried seasonings. The obvious choice is cilantro, but I’m not a very big fan. The taste seems to overwhelm everything else in a dish. If you should try this recipe, please post a comment with your thoughts, as well as any changes you may have made.

Blogroll Engineering

John Gruber recently concluded his annual Daring Fireball membership drive. Since quitting his day job a couple years ago to write DF full time, John has sold annual memberships and t-shirts (free annual membership included) to support himself in his new profession. When you become a member (as I recently did), you not only get a warm-fuzzy for supporting a great writer, and perhaps a t-shirt, you also get members-only goodies: full text RSS feeds for Daring Fireball and The Linked List. These feeds use HTTP authentication to allow access to members only.

For several years, I have used Bloglines as my feed reader of choice. It’s easy to use, does what it says on the tin, and I can access my feeds from anywhere. I have been subscribed to the standard Daring Fireball RSS feed for years, which contains only brief descriptions of each article. When I recently became a DF member, I unsubscribed from the old feed, and subscribed to the full content feed and the Linked List feed in its place (John also offers members a combined feed, but I prefer to see them separately in Bloglines). Unfortunately, as a result, Daring Fireball no longer appears in my blogroll (at least as of this writing). To see why this is, I’ll explain how my blogroll is maintained, and why this method doesn’t work for the DF members feeds.

Like most feed reading applications, Bloglines allows you to export your list of subscriptions as an OPML file. Because OPML is an XML format, its easy to turn this list of subscriptions into something else, via the magic of XSLT. This is how I create both of my blogrolls- the short version in the right-hand column of every page on this site, and the long version linked to from the end of the short version.

The first step is to obtain a copy of my Bloglines subscriptions in OPML format. Bloglines makes this available at an URL, in my case As part of my larger (and desperately in need of updating) effort to backup my data stored around the web, I have a daily cron job that runs at my webhost, grabbing a copy of the file using wget (curl would also work) and sticking it in my datasafe directory. One of these days, I’ll get that directory under version control with cvs or svn. For now, at least I have a daily backup. The wget command is simple:

 wget -O datasafe/bloglines.xml\?id=jclark

The next step is to turn the OPML into something more useful- in this case, a piece of HTML that I can include in my web pages. I have another daily cron job that runs the following perl script:

#!/usr/bin/perl -w

use XML::LibXML;
use XML::LibXSLT;

my $parser = XML::LibXML->new();
my $xslt   = XML::LibXSLT->new();

my $opml = $parser->parse_file('/home/jclark/datasafe/bloglines.xml');
my $ssdoc = $parser->parse_file('/home/jclark/xslt/blogroll.xsl');
my $ssshortdoc = $parser->parse_file('/home/jclark/xslt/blogroll-short.xsl');

my $ss = $xslt->parse_stylesheet($ssdoc);
my $ssshort = $xslt->parse_stylesheet($ssshortdoc);
my $blogroll = $ss->transform($opml);
my $blogroll_short = $ssshort->transform($opml);

     $ss->output_file($blogroll,       '/home/jclark/');
$ssshort->output_file($blogroll_short, '/home/jclark/');

The above script uses LibXSLT to transform the OPML file twice- once to create the full blogroll, and once to create the short blogroll. The transforms are similar, but the ‘short’ version only considers items in my Bloglines “Favorites” folder. If you are interested, you can see the full blogroll XSLT, and the short blogroll XSLT stylesheets.

This method of driving my blogroll from my Bloglines subscriptions has served me well – no maintenance needed. I even have control over what to include. Bloglines allows you to flag each subscription as public or private. For example, I have a few Google query feeds that don’t need to show up in my blogroll. I simply flag them as private in Bloglines, and they aren’t part of the export.

Now we’ve arrived at the crux of the matter. Because the Daring Fireball member feeds require HTTP authentication, Bloglines automatically treats them as private. This makes alot of sense, but it means that these feeds are no longer in my OPML export, and so are no longer on my Blogroll. Of course, I could have left the original feed subscribed, but I didn’t realize I would need to at the time, and I don’t want to see duplicate entries if I do. Unless I can think of a better alternative, I’ll probably add an extra folder within Bloglines to store feeds I subscribe to for the benefit of my blogroll, but which I never read directly. The other alternatives I’ve considered involve a separate list of blogroll entries stored somewhere and managed manually, so I might as well manage them where I manage the rest of my blogroll- in Bloglines. Also, because DF is in my Bloglines “Favorites” folder, it used to show up on the short blogroll on every page. If I want it to remain in the short blogroll (and I do), I’ll need to tweak the XSLT stylesheet to include entries from both folders.


According to Jeff Foxworthy, “naked” means wearing no clothes, whereas ‘nekkid’ means you’re naked and up to something.

April 5 is CSS Naked Day, but we’re up to something. According to the site,

The idea behind this event is to promote Web Standards. Plain and simple. This includes proper use of (x)html, semantic markup, a good hierarchy structure, and of course, a good ‘ol play on words. It’s time to show off your <body>.

A completely unstyled website may not look glamorous, but it proves a point. Well designed, standards-based websites work, with or without styles. I’ve tried to design this site according to these standards, and it should work reasonably well on a cell phone, in Lynx, in a screen reader, or even a search engine. As Mark Pilgrim once said, “Googlebot is just another blind user with 100 million friends.” To me, CSS Naked Day is a pointed opportunity to focus on content over style – both the explicit content of a blog post, and the implicit content (headers, lists, ALT attributes, etc) inherent in a well-designed, standards-savvy layout.

CSS Naked Day at is proudly powered by Guff’s CSS Naked Day WordPress plugin.

Note: those of you following along in via Bloglines or other feed reader, be sure to actually visit this and other participating sites today!