Friday, December 28, 2007

Recipes with Media Content

There is a fair amount of software these days that takes into account the fact that sometimes, people want to include a photo (or two or three or more) with their recipe. And why not? Some people are pretty proud of their creations and they want to show them off. But it goes a little deeper than that.

Professional chefs need the ability to store and share recipe photos as well. Many chefs have very specific plating techniques that they want to be able to disseminate to their cooks. It's important for those cooks to have the ability to reference those techniques even when the chef is out of the kitchen. Usually just one photo is enough, but sometimes more than one is required. If you look at some professional cookbooks, you might see various techniques displayed step by step, photo by photo.

Sometimes, somebody may want to distribute other media with the recipe. I don't see a whole lot of recipes calling for audio-only files, but I do see the occassional instructional video distributed. Sometimes it really helps to have accompanying text with the video. The video may demonstrate a lot of good things that are hard to get across on paper, but once a person has seen the video enough times, they may only be interested in the recipe itself.

Recipe software needs to account for users wanting to include media with their recipes. It would also be nice if that media was supported outside of the software's internal recipe database. A lot of people would be interested in distributing their media-laden recipes, given the opportunity.

The Happs

I think I've managed to confuse a lot of people lately. The comments that I've been getting on my recent posts confirm that. First, without any warning whatsoever, I start posting all of these articles about what recipe software needs to be like. I didn't explain why I was doing it, I just did it. And then in the middle of it all, I disappear for a while. What's up with that?

Let me explain the easy one first. I was in Mountain View, California the week before Christmas. The training center that I was teaching at was on Castro Street (which is not the same Castro Street as in San Francisco). Castro Street in Mountain View is a center of cultural diversity. I was within walking distance of Thai, Japanese, Chinese, Vietnamese, Korean, Indian, Indian-Chinese fusion, Irish, Greek, Scottish (?) and a few other types of restaurants. For the record, I don't recommend the Greek place. It was worse than crap.

Anyway, the point is, I didn't really spend much time on my computer in the evenings. And when came home, we had no Internet. Fortunately, the holiday season managed to distract me enough that I didn't miss it too terribly until today, when I finally got around to talking the new landlord into hooking up the wireless again.

As to the recipe software. Some of you may recall some time ago when I was working on something called the Open Recipe Format (ORF). Long story short, people got busy the project was back-burnered for a while. I still had it in the back of my mind, expecially lately. Then a couple of weeks ago, Tuxgirl was asking me some questions about recipe software. I got a wild hair and decided to start talking about what I wanted to get out of recipe software. I figured it would be the best way to explain to other developers why I want to do the things I want to do.

If somebody else takes a look at my articles and decides to write their own software, so be it. At least somebody is doing it. I didn't have a whole lot of time then, especially since it was really a bad idea to work on it at work. I work for a completely different company now than I did when I started ORF, and my free time is different. I still refuse to work on it while I'm in the classroom, but I'm starting to have plenty of time when I get back to my hotel at night. I'm hoping to spend some serious time working on it again.

In the mean time, I still have a lot to say about recipe software and I'm gonna keep saying it. It's great having your own blog, isn't it? I also have a couple of dishes that I've cooked and taken pictures of, so if that's what you read this blog for, stay tuned.

Wednesday, December 19, 2007

Same Recipe, Multiple Scalings

Back when I actually baked professionally, we used to keep our recipes in binders around the bakery. These binders would be labelled with things like, "Breads", "Cakes and Cookies", and the aptly-named "Odd Stuff". The recipes in these binders were on standard 8.5" x 11" paper, hand-written into photocopied forms, and then stuffed into plastic protector pages. When a recipe was needed, it would be extracted from the binder, and the plastic protector page would keep the recipe from getting gross and icky as it was inevitably splashed with cream, melted butter, egg whites and the like. When we were done, we would wipe off the plastic and put the recipe back in the binder.

This was a fine system, except for one problem: the recipes were hand-written. Some were easier to read than others, and those which were faxed from one lodge to another were especially difficult to deal with. The executive pastry chef apologized at the beginning of the ski season for the hand-written recipes, and promised that solutions were being looked at. Many of you are thinking, what's the big deal? Why not just type up and print out the recipes like normal people?

Yes, they could do that. It would be a lot of work, probably taking up a week or so of a single baker's time, and when you're only open for 4 1/2 months out of the year, you tend to focus your energy during that time on managing the rest of the bakery. When the season is over, the majority of bakers leave town, often to work at another resort across the country or world until the next ski season. The skeleton crew that is left focuses their resources on other events for the next several months. And yet, that wasn't really the problem.

The problem had to do with how the recipes were laid out. Let's take my basic cheesecake for example. Sometimes, the bakery only needs to produce one cheesecake. This isn't often, but it happens. More often, something like eight cheesecakes would need to be made. Sometimes only four. Sometimes as many as twelve. With experience, these numbers were somewhat predictable.

We need the recipe for a single cheesecake. Even if we never make just one, this is the basis for which all other amounts will be calculated. We have eight spring form pans, but we rarely need to bake more than five cheesecakes at once. Except in the busy seasons, anything more than five would result in a shelf life longer than a week, which would result in a loss of quality. During the busy weeks, we may need to make eight cheesecakes at a time, and we may need to do so every other day. So we need, at the very least, ingredient lists printed up for 1, 5 and 8 cheesecakes. It would be nice to have them all printed up on the same page, mostly for manageability. And it would also be nice to have at least one or two extra columns on that page, just in case a new amount needs to be calculated (for instance, we buy another 8 spring form pans).

Going from memory (and likely leaving out some subtle details), the form (complete with the aforementioned cheesecake recipe) looked something like this:

 Oven Temp275F
 Oven FanLowHigh
cream cheese2 lbs10 lbs16 lbs 
white, granulated sugar1 cup5 cups8 cups 
large eggs42032 
vanilla extract2 tsp3 Tbsp
+ 1 tsp
5 Tbsp
+ 1 tsp

1. Preheat oven to 275F.
2. Allow the cream cheese to warm up to room temperature.
3. In a mixer, cream together the cream cheese and the sugar with the mixer's paddle attachment until light and fluffy.
4. Add the vanilla.
5. Add one egg and mix on low speed. When it is fully integrated, stop the mixer and scrape down the sides and the paddle with a rubber spatula.
6. Continue adding eggs the same way, one by one.
7. When the mixture is smooth and there are no lumps, pour it into a prepared 9-inch round cake pan.
8. Move to a 275F oven and set the timer for 1 hour.
9. After an hour, jiggle the pan a little. If the center still seems liquid, close the door and wait a few minutes before checking again.
10. When the center is only a little wiggly (but no longer liquid), turn the oven off.
11. Leave the oven door open for 1 minute, and then close it again.
12. Allow the cheesecake to sit in the oven for 1 more hour as both the cheesecake and the oven cool.
13. Move the cheesecake to the refrigerator and chill for at least 6 hours (overnight is better) before attempting to cut and serve.

You'll notice that I've abandoned the format suggested in my post about standardizing recipes. I hope that I made it clear in that post that that particular format was not applicable to every kitchen. In the case of this bakery, it would only serve to add confusion and leave no room for multiple scalings.

Take note of the multiple scalings. First of all, this bakery would never have stuck with volume measurements. They would have been converted to weight almost immediately. You'll notice that each column is simply laid out, and easy to follow. Some bakers, to make sure that they don't accidentally look at the wrong column, would cover up the others with masking tape until they were done with the recipe. If they needed a temporary scaling, they would cover the last (blank) column with masking tape and write the new amounts on it. If they used it enough, they would pull out the actual paper and fill in a new column.

I added a couple of other things that I have not yet mentioned. The oven temp is clearly noted at the top of the page, so that the baker can set the oven without having to search the instructions for the temp, and then start to gather ingredients. There's also a place where the baker can circle whether they set the oven fan to high or low. Many professional bakeries make use of convection ovens which have only two fan settings: low and high (but not off). In retrospect, I think the bakery would rather have had a temperature setting for low, and another one for high. Maybe even a third one for "no fan", for their older ovens.

I do not know of any recipe software on the planet that takes all of these things into account. And from talking to other bakers, cooks and chefs, this feature is sorely needed. The corporation that owned that ski resort had spent years trying to find suitable software, and had come up empty-handed. The last I heard, they were working on building something in-house, and it did not look promising. The bakery was not interested in investing any time in typing recipes until the software was made available. Any significant difference in how they typed them and how the new software would handle data entry could represent days worth of lost time and duplicated efforts.

Let's say we got software that supported printing out multiple scalings one a single page. There's another problem here: saving the multiple scalings. Some of you are thinking, "why not just save the amounts for a single cheesecake, and then choose other amounts just before printing?" Let me ask you: have you ever made rice before?

I think Alton Brown summed this up nicely in the landmark Good Eats episode, Power to the Pilaf. Most rice packages instruct you to use one part rice to two parts water, by volume, regardless of how much rice you're actually making. But as he points out, you can actually cook one cup of rice in a cup and a half of water. Two cups of rice will cook nicely in 2 3/4 cups of water. And Three cups of rice will cook properly in 3 1/2 cups of water.

As much as we (especially programmers) would like to think that food fits neatly into our carefully-calibrated mathematical world, it does not. Food is organic. It is grown, largely by a set of rules that we still don't completely understand. No cup of rice is the same, no pound of flour. All that we can do, even in the best of times, is approximate. Doubling recipes will often work, to a certain degree. But there will be a point in which our ingredients will rebel against us, and only the hand of an experienced cook or baker will be able to control the chaos. And when that cook or baker discovers that their approximation has changed because of the sheer amount of food that they are making, they make a note of it. And if you think they want to figure it out every time, or let the next guy figure it out from scratch, you're out of your mind.

Recipe software needs to have the ability to not only scale properly, but also record the (user-adjusted) changes based on amount, and optionally print it out on the same sheet, with easy to reference columns side-by-side for the cook or baker's convenience. We don't currently have software that supports this. We, as home cooks, may not need it. But our professional counterparts do.

Tuesday, December 18, 2007

Adding HACCP to Recipes

Knowing what HACCP is is all well and good, but unless you know how to use it, it doesn't really do you any good. If we want to know how to add HACCP support to our software, we need to know what a finished HACCP recipe looks like. I'm going to incorporate the points laid out in my HACCP post with the layout that I used in my post about standardizing recipes.

For brevity, I'm not going to post the original recipe first this time. I'm going to use an old recipe that I posted some time ago for Kai Yang. If you would like to look at the original, complete with all of the flaws that I've talked about, go for it.
2 tablespoons minced fresh ginger
2 tablespoons chopped fresh lemongrass
2 tablespoons chopped fresh cilantro
1 teaspoon sugar
1 tablespoon ground black pepper
2 tablespoons curry paste
1/2 teaspoon sriracha
1 tablespoon fish sauce
1 cup lite soy sauce
1 cup veggie stock
Combine all ingredients in a blender. Mix well.
2 pounds dark chicken meat, in piecesAdd chicken and other ingredients to a resealable container.
 CCP: Chill to a temperature of 139F for a period of 6 hours.
 Halfway through the refrigeration process, turn the meat over.
 Remove the meat from the liquid.
 CCP: Because the liquid contained raw meat, discard the liquid as quickly as possible to avoid cross-contamination.
 Mark the chicken on the grill, then place on a sheet pan and move to a 400F oven.
 CCP: Bake the chicken until a thermometer placed into the deepest part of the meat reads 165F.
 CCP: Keep chicken at a temperature of at least 140F until it is served.
 CCP: If chicken is to be stored for service at a later time, chill to a temperature of 139F or lower as quickly as possible, and freeze or refrigerate no warmer than 139F.
 CCP:Chicken that has been chilled for storage should be heated to at least 165F before service, and then kept at a temperature of at least 140F until it is served.
 CCP:Chicken should not be chilled at reheated more than once. If chicken is not consumed after being chilled and reheated once, then it should be discarded.

That's a lot of critical control points, isn't it? And believe me, there could be more. I've decided to simplify, for the purpose of instruction. If NASA was sending my kai yang recipe into space, they would likely have several more steps marked CCP.

You'll notice that many of the CCPs focus on temperatures. This is one of the more critical components of food safety, and something likely to appear in almost every HACCP plan. I've also pointed out things like cross-contamination, and only reheating the product once. Technically you could probably get away with multiple reheatings, but the quality would suffer, and each trip between 41F and 140F (both cooling and heating) would accumulate as additional time that the food spent in the danger zone.

This is just a brief overview of what a recipe with integrated HACCP instructions might look like. Any serious commercial software should take such recipes into consideration, and possibly seek additional information from more experienced sources.

Friday, December 14, 2007


I've spent a good bit of time talking about recipes. I'd like to take a moment now to deviate somewhat from that discussion to give some background information on something called Hazard Analysis and Critical Control Points, or HACCP (pronounced "hassup").

Back in the 60's, when NASA was getting ready to send people up into outer space, they realized that they had a problem on their hands. If astronauts got sick while in the air, their ability to receive medical attention would be severely limited. The obvious solution of course, was to do whatever they could to prevent the astronauts from getting sick in the first place. One of the most crucial elements of this was exacting a level of control over the food that was sent up with them that would eliminate the chance of food poisoning.

Pillsbury was contracted to design, manufacture and provide the first space meals. HACCP was developed in order to keep food preparation well-within safe limits. It has proven to be very effective, and has since been adopted into other concerns outside of food, such as pharmaceuticals and cosmetics.

HACCP is based upon seven principles:

Principle 1: Conduct a hazard analysis
Procedures must be carefully inspected to discover at which points an unsafe practice may be introduced into the process. In terms of recipes, one may look at factors such as raw meat or eggs. If there is some item that may cause unsafe conditions to occur at any point, it should be noted.

Principle 2: Identify critical control points
A critical control point (CCP) is any step in the process when a control can be applied to limit, and hopefully eliminate unsafe actions. For instance, meat and poultry being cooked to a certain temperature to prevent salmonella, e. coli and other food borne illnesses.

Principle 3: Establish critical limits for each critical control point
This is the minimum and/or maximum limit to which a hazard must be controlled in order to ensure that it is at an acceptable level of safety. For example, poultry and ground meat should be cooked to at least 165F to kill off any pathogens that may be lurking within.

Principle 4: Establish critical control point monitoring requirements
We need to determine how to monitor the controls that have been identified to this point. Will a thermometer be required? Or is there some other mechanism that needs to be in place. In terms of meat and poultry, an accurate thermometer should be used to ensure that the inner meat has reached the appropriate level.

Principle 5: Establish corrective actions
If the above steps have been followed properly, then we shouldn't need to perform any corrective actions. But they do need to be in place, so that when something does go wrong, we have something to fall back to. If a pot of soup has dropped below 140F, then it needs to be removed from service until it has been properly heated to the correct temperature. If that soup has spent more than 4 hours (cumulatively, not at a time) under 140F, then it needs to be removed from service and discarded. If the time at which it has remained under 140F cannot be established, then it needs to be removed from service and discarded.

Principle 6: Establish record keeping procedures
This principle actually serves two purposes. If you've been able to keep proper records, then there will be no question as to how long that soup has been sitting out at under 140F. It's another layer of control that allows you to know, from start to finish, what the status (both safe and unsafe) of your product is at. If something goes wrong, this principle also provides you with proof (which may be helpful and/or necessary for legal reasons) that you either did something correctly or incorrectly.

Principle 7: Establish procedures for ensuring that the HACCP system is working as intended
It's all well and good to have a system in place. But if you have no way of knowing whether it's actually doing what you want it to do, then it's largely useless. Once you have your plan in place, you need another plan to make sure that the first one will work... before you even implement it. In fact, some organizations will not approve your plan without having this benchmark already in place. You may also find as you develop these additional procedures that there are holes in your HACCP plan. These procedures will let you know for sure one way or another.

Why have I made a point to explain HACCP? Many organizations are legally required to abide by these rules, and have their own HACCP plan in place. In fact, meat packers, egg farms and the like fall into this category. The corner bakery may not have the resources to implement and enforce their own HACCP system, but the hotel bakery probably will. And the corner bakery probably should, as soon as they're able. Recipe software that is expected to be used commercially needs to have features in place to accommodate such operations if it is ever to be seriously considered for use.

Standardizing Recipes

Having a properly-written recipe is an excellent step in the right direction. And for most home cooks, that's going to be good enough. But for professional kitchens as well as for control freaks such as myself (I'm a nerd, it comes with the package), there's still plenty of work to be done.

Standardizing recipes offers many advantages in a professional environment. When every recipe in the chef's binder looks the same, his or her cooks and/or bakers don't need to guess at things. As you know from my previous post, clear and concise instructions are a must. But having recipes that compliment the flow of the kitchen will convert time wasted thinking about what to do into time used doing what needs to be done.

One of my favorite styles of formatting recipes combines a neatly-ordered and easy to access list of ingredients alongside the applicable instructions for each ingredient, or group of ingredients. Let's use my suspiciously-familiar chocolate chip cookie recipe as a starting point:

1 cup (2 sticks) unsalted butter
3/4 cup granulated sugar
3/4 cup + 1 tablespoon packed dark brown sugar
1 teaspoon vanilla extract
2 large eggs
2 1/2 cups bread flour
1 1/2 teaspoons baking soda
1 teaspoon salt
2 cups chocolate chips

1. Preheat oven to 300F.
2. Allow butter to warm up to room temperature.
3. In a mixer, cream together the butter and the sugars with the mixer's paddle attachment until light and fluffy.
4. Add the vanilla extract.
5. Add one egg and mix on low speed. When it is fully integrated, stop the mixer and scrape down the sides and the paddle with a rubber spatula.
6. Continue adding eggs the same way, one by one.
7. When the eggs are fully integrated, stop the mixer.
8. Whisk together and then sift the flour, baking soda and salt into the bowl.
9. Mix at the lowest speed with the paddle attachment until the dry ingredients are just barely mixed in, scraping as necessary.
10. Stop the mixer and add the chocolate chips.
11. Mix at the lowest speed for just long enough to mix in the chips.
12. Scoop onto cookie sheets with a #40 scoop, leaving room between the cookies to allow for spreading.
13. Move to a 300F oven and set the timer for 12 minutes.
14. After 12 minutes, look at the cookies. When they are just starting to brown on the edges, remove from the oven and allow to cool.

It's certainly much easier to reference here than in my tutorial, isn't it? This recipe serves as nothing more than a set of instructions for somebody who, presumably, already knows what they're doing in the bakery. They may not have seen this recipe before, but they can easily follow it.

Note the order in which I have the ingredients. Because the butter and sugars will be used first, they have been listed first. Wet ingredients are listed next, and then dry, because that's the order in which they will be added to the mixer.

In the instructions, you'll notice that I started with the oven temperature, since preheating it what will likely take the longest. In a professional bakery, the oven will likely already be preheated, but may not be at the correct temperature. Letting the butter soften takes a long time too, so it goes next.

This is a good recipe, but it we can improve upon it for professional use. Those of you that are deeply concerned about HACCP will appreciate these improvements.
 1. Preheat oven to 300F.
1 cup (2 sticks) unsalted butter2. Allow butter to warm up to room temperature.
3/4 cup granulated sugar3. In a mixer, cream together the butter and the sugars with the mixer's paddle attachment until light and fluffy.
3/4 cup + 1 tablespoon packed dark brown sugar 
1 teaspoon vanilla extract4. Add the vanilla extract.
2 large eggs5. Add one egg and mix on low speed. When it is fully integrated, stop the mixer and scrape down the sides and the paddle with a rubber spatula.
 6. Continue adding eggs the same way, one by one.
 7. When the eggs are fully integrated, stop the mixer.
2 1/2 cups bread flour8. Whisk together and then sift the flour, baking soda and salt into the bowl.
1 1/2 teaspoons baking soda 
1 teaspoon salt 
 9. Mix at the lowest speed with the paddle attachment until the dry ingredients are just barely mixed in, scraping as necessary.
2 cups chocolate chips10. Stop the mixer and add the chocolate chips.
 11. Mix at the lowest speed for just long enough to mix in the chips.
 12. Scoop onto cookie sheets with a #40 scoop, leaving room between the cookies to allow for spreading.
 13. Move to a 300F oven and set the timer for 12 minutes.
 14. After 12 minutes, look at the cookies. When they are just starting to brown on the edges, remove from the oven and allow to cool.

You'll notice that everything is in exactly the same order as before, but the ingredients are listed next to the steps that require them. This way we still have easy access to the ingredient list for shopping purposes and so on, without needing to read through the entire recipe to get everything. Also, the reader now has hints at a glance as to where exactly to expect the ingredient to be needed. This can help them prepare mentally in the middle of the actually cooking or baking process.

This recipe formatting may be overkill for most home cooks and bakers. But it may be helpful, if not essential, in many professional kitchens and bakeries. And quite honestly, it doesn't hurt the home cook either. In fact, they may come to like it.

Of course, this formatting will not necessarily be applicable to every professional kitchen. It may be that what we started out with is perfect for your operation. You need to analyze the needs of your staff and consider the other variables in the equation, such as kitchen layout, the ingredients that you work with, which equipment you have available, and so on.

The professional kitchen that wants to adopt this or similar formatting will want to make sure they do so for all of their recipes. You're not really standardizing anything until you do so. But having all of the recipes laid out in the same way, and having that way be efficient and easy to use will increase productivity.

Thursday, December 13, 2007

Writing Recipes

If you're a regular reader here, then you will probably notice by the end of this post that I have broken almost every rule set forth in it, and still do so on a regular basis. I'm trying to get better. Whenever I get around to setting up an actual database of recipes from my blog, I hope to have time to rewrite them in accordance with these guidelines.

Consider the following set of instructions:

Mix together 2 pounds of cream cheese with a cup of sugar, using the paddle attachment. Add four eggs, 1 at a time, with 2 tsp vanilla. Pour into crust, bake at 275 degrees for 1 hour, then turn off oven and let cool inside for another hour. Chill for no less than 6 hours before serving.

Many of you might recognize this as a recipe for a pretty basic cheesecake. But it (the recipe) has a lot of problems, especially for commercial use. Ignoring for now the lack of instructions for the crust itself, let's take a look at a few of the problems.

First of all, there is no ingredient list. This is reminiscent of my earlier posts, where my intent was to tell a story, not necessarily provide a reference of any sort. If you want to find out what to shop for, you need to read the entire recipe and make your own list. Granted, you should read the recipe anyway before doing anything with it, but this adds an extra layer of work.

You may also notice that in some places numbers are spelled out, whereas in other places actual numerals are used. This makes it difficult for somebody to pick out measurements in a hurry. Speaking of measurements, you may also notice that full spellings and abbreviations are intermixed. This causes the same problem. It may be okay for emailing to cousin Vinny, but it'll never fly in a professional operation. "275 degrees"? Fahrenheit or Celsius? Probably Fahrenheit, but they should have specified.

"...Using the paddle attachment..."? Those of you with stand mixers know what's going on here, but what about everyone else? Most of these instructions are pretty vague. Who knows how that vanilla is really supposed to be added? In fact, it's almost like a reminder for somebody that's made this recipe hundreds of times, rather than a helpful set of instructions for somebody who's never made it before. It's almost as bad as some of the old Unix/Linux man pages. Then again, I've also seen some recipes who's instructions are little more than "creaming method".

Let's examine another version of the recipe:

2 lbs cream cheese
1c sugar
4 eggs
2 tsp vanilla

1. Cream together the cream cheese and sugar. Add eggs one at a time.
2. Slowly add in the vanilla with the eggs.
3. Pour into crust and bake at 275F for one hour.
4. After an hour, give the pan a shake. If it still looks liquid in the center, close the door and check again in a few minutes. When it just barely wobbles in the center, turn the oven off. Leave the cheesecake in the oven for another hour as the oven is cooling.
5. Let chill for at least 6 hours before cutting and serving.

Well, at least we have an ingredient list now. But what the heck is "1c sugar"? Probably a cup. Most people can figure that out. I say most, because some people (especially a more timid cook) may be confused and/or intimidated by that notation. Everything else in the ingredient list looks good though.

Step 1 already presents a problem. It should have been divided into two steps. And Step 2 isn't really any clearer than before. Step 3 should also be divided into separate steps, one of which should have started the recipe: "1. Preheat oven to 275F." By Step 4, we've pretty much given up on trying to divide up steps. The cook might have thought that it was pretty clear as one step, but when a single step is more than three times longer than any other single step, there's a good chance it needs to be rethought.

The recipe, unfortunately, still tends to be vague in some places and somewhat clearer in others. When you write a recipe, you should assume that the next person who looks at it has never seen it before. Don't try to give a cooking lesson in the recipe itself. If you need to tell a story, make sure you list the recipe outside the story as a separate entity. But if there is some subtle nuance, make sure to note it. Too many recipes have caveats that the creator knew about, and then assumed everyone else knew about too.

Let's consider a more properly-written recipe:

2 lbs (four 8 oz pkgs) cream cheese
1 cup white, granulated sugar
4 large eggs
2 tsp vanilla extract

1. Preheat oven to 275F.
2. Allow the cream cheese to warm up to room temperature.
3. In a mixer, cream together the cream cheese and the sugar with the mixer's paddle attachment until light and fluffy.
4. Add the vanilla.
5. Add one egg and mix on low speed. When it is fully integrated, stop the mixer and scrape down the sides and the paddle with a rubber spatula.
6. Continue adding eggs the same way, one by one.
7. When the mixture is smooth and there are no lumps, pour it into a prepared 9-inch round cake pan.
8. Move to a 275F oven and set the timer for 1 hour.
9. After an hour, jiggle the pan a little. If the center still seems liquid, close the door and wait a few minutes before checking again.
10. When the center is only a little wiggly (but no longer liquid), turn the oven off.
11. Leave the oven door open for 1 minute, and then close it again.
12. Allow the cheesecake to sit in the oven for 1 more hour as both the cheesecake and the oven cool.
13. Move the cheesecake to the refrigerator and chill for at least 6 hours (overnight is better) before attempting to cut and serve.

This recipe is a lot easier to handle. The ingredients are clear, and specific. The steps are all reasonably small, and have only one actual instruction per step. Each step is reasonably clear, and while it does not explain what might go wrong if you ignore the instructions (that's what cooking classes are for), it does give you the proper instructions with the nuances noted (such as scraping the bowl and the paddle). It could probably still use a bit of improvement, but at this point it's in pretty good shape.

Like I said, most of the recipes on my blog are not this well-written. It's pretty painful for me to go back and look at a lot of my earlier material. But it's even more painful for me to think about changing an entry, at least without some sort of revision control to save the old format, as a reminder of how I used to write. But one day I do plan on rewriting as many recipes as possible and making them available in a much easier-to-use database.

When you start publishing recipes of your own, you'll want to take these guidelines into consideration. I'll refer to them in upcoming posts, which will make them just that much more relevant.

Wednesday, December 12, 2007

Volume Measurements

One of the biggest problem I've seen with commercial recipe software is in scaling recipes. Say you have a recipe that yields four portions. This is normally perfect for your family, but you have extended family coming over this weekend and you need eight portions. Just double it, right? No problem.

What if you've managed to track down a recipe that normally feeds 50, and you need it to feed your small family of four. What do you do now? That's easy. Just plug it into your home recipe program and suddenly that cup of Worcestershire sauce becomes... 0.08 cups? How the heck are you supposed to measure that? Such a pain. How about if I told you that 0.08 cups was equal to 0.64 fluid ounces? Is that any easier to deal with? Not really. What if I told you that was roughly the same as one tablespoon plus one teaspoon? Okay, we can handle that.

What recipe software needs to do is give us answers in terms of fractions and measurements that may have different names that what we entered, if necessary. For instance, we entered cups, but what we needed back were teaspoons and tablespoons. Decimals are fine for scientists and maybe wholesale food operations, but not for home users, and not even for most professional kitchens.

First of all, we need a basic breakdown. How many of X are in Y? Note: These measurements are standard US (imperial) measurements. Metric is easier, but not as common in my country.

1 tablespoon = 3 teaspoons
1 fluid ounce = 1 tablespoon
1 cup = 8 fluid ounces
1 pint = 2 cups
1 quart = 2 pints
1 magnum = 2 quarts
1 gallon = 4 quarts
1 peck = 2 gallons
1 bushel = 4 pecks

Okay, so magnums are usually only used in winespeak. And pecks and bushels aren't all that common, even in commercial kitchens. The highest they usually go is gallons, though at that level of production, they usually measure by weight. But that's another topic altogether.

It should also be noted that we occassionally measure in fractions. Most home and professional kitchens have both measuring cups (usually 1 cup, 1/2 cup, 1/3 cup, 1/4 cup) and measuring spoons (usually 1 Tbsp [tablespoon], 1 tsp [teaspoon], 1/2 tsp, 1/4 tsp). Oddly, 1/2 Tbsp, 1/3 Tbsp and even 1/3 tsp are pretty uncommon. Then again, we already know that 1/2 Tbsp = 1 1/2 tsp and 1/3 Tbsp = 1 tsp. 1/3 tsp gets left in the cold. Also, many cooks refer to a dash and a pinch as roughly 1/8 tsp, where a dash is for liquid ingredients and a pinch is for dry.

So we need software that will give us measurements using the smallest and/or easiest version of the following measurements:
  • 1/8 teaspoon
  • 1/4 teaspoon
  • 1/2 teaspoon
  • teaspoon
  • tablespoon
  • fluid ounce
  • 1/4 cup
  • 1/3 cup
  • 1/2 cup
  • cup
  • pint
  • quart
  • gallon

Other measurements are nice, but these will be sufficient for most operations. But that still doesn't help us in terms of actually setting up software. We need a common measurement that is easy to work with, that everything else can be converted to and from. Fortunately, in this measurement system (for both weight and volume) we have ounces. Every whole measurement larger than an ounce can be calculated in terms of full ounces, and everything smaller than an ounce can be calculated in terms of fractions of an ounce. But that still doesn't solve the decimal problem.

When it comes to decimals, we're going to have to do some rounding. I would personally prefer my software to tell me both the decimal value, and the approximate fraction(s) that that relates to, and let me choose. I suspect most bakers would start off wanting just the fraction, and after a week of failed pastries demand to know what the decimal would have been, so that they can adjust accordingly. Most cooks (non-bakers) would likely be fine with the approximations.

Note: this table will attempt to be conservative, for instance, only covering the values up to half an ounce. That should be sufficient for our needs. Since you would not normally be hard-coding values, I'll also include the fraction of an ounce. If you can't figure out how to convert fractions into division in your code, it's time to pick up a new hobby/career.

1/8 teaspoon = 0.020833333 oz (1/48 oz)
1/4 teaspoon = 0.041666667 oz (1/24 oz)
1/2 teaspoon = 0.083333333 oz (1/12 oz)
1 teaspoon = 0.166666667 oz (1/6 oz)
1 tablespoon = 0.5 oz (1/2 oz)

This tells us exact values. Unfortunately, few of our recipes will scale to exactly these amounts. So we round.

1/8 teaspoon = 0.020833333 oz (1/48 oz)
  0.03125 oz (1/32 oz)
1/4 teaspoon = 0.041666667 oz (1/24 oz)
  0.0625 oz (1/16 oz)
1/2 teaspoon = 0.083333333 oz (1/12 oz)
  0.125 oz (1/8 oz)
1 teaspoon = 0.166666667 oz (1/6 oz)
  0.25 oz (1/4 oz)
1 tablespoon = 0.5 oz (1/2 oz)

Anything smaller than 0.03125 oz is considered 1/8 teaspoon (a pinch or a dash), anything between that and .0625 is considered 1/4 teaspoon, and so on.

This is a pretty basic operation. Many years ago I had a Perl subroutine that did this for me (with a good bit of help from Harley), and I've managed to lose it. One day I'll write it again, unless somebody else beats me to it. But it seems to me that any recipe software worth using would take the above information into account.

Many thanks to TuxGirl for helping me with the math, since I'm so horrible at it myself. Yet another reason why I need my software to do my thinking for me.

Tuesday, December 4, 2007


Being in the Financial District of San Francisco, my hotel is actually less than a mile from the famous San Francisco Chinatown. I decided to take a walk over there this evening to see what I could see. First things first: I did not buy food there. Deal with it.

On the way there, I walked by what seemed to be an adult video store, which had a neon sign in the window advertising watch repair. I decided against going in to ask about it. I had more important things to deal with. I don't think I was in Chinatown just yet, but about half of the businesses that I walked by had Chinese signs on them. As I looked down the sidestreets to my left, I could see a plethora of Chinese shops. I knew I was close. What I didn't know was how close. Had I walked down any of those streets, I apparently would have been in Chinatown a block later.

I did eventually find my way first to Stockton Street, and then to Grant Street. According to Wikipedia, Stockton is supposed to be more authentic, but the parts that I saw seemed pretty touristy to me. Grant seemed pretty dead. Maybe I was on the wrong part.

TuxGirl told me that I needed to find jade chopsticks. Apparently one of her teachers in elementary school had a pair and she's been coveting them ever since. Of course, she didn't actually tell me to pick her up a set, so I thought I'd grab a set of my own and just taunt her with them.

I decided that it would be best to find a gift shop. The first one I saw looked colorful, and had little toys displayed out front, next to a large sign that proclaimed, "Gift Shop". As I walked in, I immediately realized that the majority of what they considered to be gifts were actually extremely expensive-looking blown glass. As I walked in, a somewhat thuggish-looking man (who was very American-looking and sounding) asked me if he could help me find anything. I politely declined and informed him that I was just looking. As I walked through the store and looked at all of the things that I could never afford, he followed silently behind. Perhaps it wasn't such a good idea to be wearing my biker jacket in there.

At one point, he informed me that everything was 50-75% off, and then fell back again, to follow me from a comfortable distance. I decided I'd had enough and I left. As I walked out, I saw a very thuggish-looking Chinese man watching the door. I'd never seen a gift shop, or a blown glass shop before that came complete with its own bouncers.

I found another gift shop that looked like it specialized in cheap t-shirts. They had chopsticks, but nothing in jade. But they did have children-sized Cheongsam dresses and jumpsuits. You have no idea how long I've been trying to find Cheongsam jumpsuits. I bought a red dress and pink jump suit for my daughter, and let the shop owner talk me into buying the accompanying shoes and hand bags. He assured me that he wanted my daughter to look good. I didn't mind so much, considering that I only spent $35 on everything, and he tossed in a free pink coin purse for her.

I asked him if he knew where I could find jade chopsticks, and I told me to walk a block one way and go across the street. I did so and found the shop that he was likely talking about, with boards in its windows. They were apparently closed. I kept walking and found a couple more likely gift shops. The first one was so packed full of trinkets that I couldn't move through it without making something or other jangle around me. I couldn't even see the face that belonged to the voice telling me that no, he had no jade chopsticks. The next shop wasn't as full of junk, but the woman told me that she didn't have any either, and such a thing would be difficult to find.

Two doors down, I located a market that seemed either to have several stores inside, or have one store with several registers only serving that department. I saw a sign on the second floor advertising jade, and made my way up. I asked the man if they had any jade chopsticks, and he directed me to the gift shop downstairs. I got there and found several very nice-looking jade chopsticks, at only $15.99 for two pairs. I don't know that it's actually real jade, but I grabbed some anyway. I plan to email a photo to TuxGirl later to taunt her.

I decided to be finished for the evening and head back to my hotel. Naturally, I got lost almost immediately. Fortunately, I only went two blocks before realizing that I was going in the wrong direction, and four blocks later I was back to a location that I recognized on Kearny Street, headed back to my hotel. I stopped by a place called Kearny Street Pies on the way, which was owned by a Brit. Disappointingly (or perhaps reassuringly?) there was no barber shop upstairs. The chicken pie wasn't very good, but I liked the beef pie. The mini raspberry tart was a little too sweet, but it all went very well with a can of Orangina.

By the time I got back to my hotel, I was sweating. It was cold enough to require a jacket, and mine was just light/heavy enough to be perfect outside and way too hot inside, even in the stores that didn't seem to have front doors. I brought a lighter jacket with me, so maybe I'll go back tomorrow wearing it instead.

Monday, December 3, 2007

I Left My Mouse in San Francisco

Actually, I left it in Montreal. But the training center there was kind enough to ship it back to me, so that I might be able to bring it to San Francisco with me. Hopefully I won't forget it this time.

As you've probably already guessed, I'm in the bay area this week! My hotel and training center are both downtown in the financial district, about a block from each other. And both are just a couple of blocks from the BART station. That means I don't have to drive this week! A definite advantage in this town. I also seem to be within a five minute walking distance from several tasty-looking restaurants, which hasn't stopped me from ordering delivery my first night here, and room service my second night here. I blame The Cave.

The airport seemed nice enough. I had looked up info on BART before flying out, and didn't recognize immediately that the airport's air train is not the same thing as BART. I spent several minutes trying to figure out where to buy BART tickets before finally realizing that I was not yet at a BART station. Oops!

BART is awesome. When I hopped on at the airport, it was mostly empty. It stayed that way for the majority of the half-hour trip to downtown. A couple of stops before mine it started to fill up pretty quickly. I ended up vacating my spot for a tired-looking black woman for the last couple of stops. A lot of the trip is underground, which I was pretty happy about because for some reason that I can't explain, subways have always fascinated me.

Having done a little research, I am hugely impressed with the public transportation in the bay area. Everyone knows about the trolley system, but I don't think most people outside of this area really understand how awesome the trains are. I've been hoping beyond hope that Salt Lake would get its act together and get commuter rail running, and this didn't help. Let's move it, people!

Unfortunately, the ease of my journey stopped when I left the station. Have you ever been walking around downtown and noticed a guy that seems to be wandering aimlessly, on a path who's logic is known only to him? That was me. I knew that my hotel was only a couple of blocks away, but I didn't know in which direction. I would walk a block or two, then turn around and walk back to the subway. Even the homeless man asking for money started giving me strange looks. Finally I decided to consult the GPS. It got me going in the right direction, and then lost signal (did I mention the large number of large buildings in the area?). I overshot my hotel's street by three blocks before turning around and finding it. Then I walked past my hotel on the other side of the street and had to go back again.

It's a nice hotel. A lot like the one I stayed in in Montreal, except with a much smaller room and no crazy girls trying to bring me chocolate and bottled water. No room service on Sunday, so I ordered pizza and fried ravioli from a local Italian joint. It was okay, but nothing to write home about. No Food Network on the TV, and the only channel worth watching is Discovery. Tonight Discovery is too fuzzy to watch. Last night I woke up to the sounds of sirens. A lot. Mostly it sounded like fire engines. I hope it wasn't my building.

The training center was easy to find. Walk across the street, go a block, turn right, go half a block, and I'm there. It's the third Microtek center that I've taught in, and it's pretty nice. My students all seem pretty bright, and even the ones that claim to have only limited (if any) experience in Linux are doing quite well (it's a sysadmin class). They tell me that sirens are a common sound in San Francisco.

The walk back seemed even shorter than the walk there. In fact, it didn't seem to take longer than a couple of minutes. For my cousin Ali: I really was going to walk somewhere to eat. But the reuben on the room service menu had been calling my name since Sunday night, when I was informed that room service was closed on Sunday. I also ordered a Shirley Temple. I haven't had one of those in a good couple of years and man, was it good. I'm going to stock up on grenadine when I get home. The reuben was pretty good too, if a little heavy on the sauerkraut.

It's only 7:45ish here, but my brain is still on mountain time, so it feels a little later. This is really going to mess with me when I get to Houston next week. But for now, I can enjoy what really does seem to be one of the greatest cities on the planet. Assuming I ever leave my hotel room, of course.

Saturday, December 1, 2007

Finally Reinstalled! Yay!

It was a tale of tragedy, a tale of woe... almost. But I'm already getting ahead of myself.

My notebook is somewhere around four years old. It was a good computer when I got it, but it wasn't long after the warranty expired (two weeks, as I recall) that the CD-ROM drive started to die. At first it refused to read any burned CD, but pressed CDs were still okay. It was about that time that I finally wiped the Windows XP install that came on it and installed version 5.10 of Ubuntu Linux. Shortly after that, the computer refused to read any CDs at all. Score one for Sony.

Fortunately, Christer helped me upgrade to version 6.06 some time later. Unfortunately, the upgrade did not go as well as I had hoped, and I began to get paranoid. Not long after that, I made a mistake. I tried to install a new Perl package via CPAN. I was working on a lot of things that day, and perhaps not spending enough mental energy on some of them. I learned an important lesson that day: if CPAN asks whether you want it to update your version of Perl, tell it No. Exit out of CPAN and install it via yum or aptitude instead.

To make a long story short, I broke a lot of things that day. The easiest thing to do would have been to back everything up and just reinstall. Unfortunately, with no CD-ROM drive, that didn't seem to be an option. So I repaired things the best I could and lived with it. I take comfort in the fact that at least it was a broken Linux system. If the number of things that had gone wrong had happened in Windows, I would have been completely screwed.

Fast forward to a couple of months ago, when I learned that Ubuntu could be installed over the network using a combination of kickstart and PXE. This seemed like a good plan, because my computer does not support USB boot (another point for Sony), but it does support PXE booting. I decided to read up on it and see if I could get it to work. Then I went on the road for a couple of months in a row, and got distracted. By the time I got back, Christer and Clint had figured it out.

I managed to go about a month without leaving town, and Christer and Clint spent that month trying to convince me to reinstall. My paranoia kept me from doing anything until yesterday. As a Linux instructor, I'm dead in the water without my computer. I was afraid that something would go wrong in the middle of the install, and that I would have to go back on the road before I had time to fix it. Finally, I backed everything up and went for it.

The installation seemed to be going well. I had booted to a PXE server that Christer and Clint had set up an Ubuntu install on, and I was already to the copying files stage. That means that my drive had already been wiped, and that I was way past the point of turning back. Then my notebook decided to overheat and turn itself off, without warning (and Sony scores against me yet again). I propped it up to get some airflow underneath, found a portable fan and pointed it at the hot spot on my computer and started over.

Things were going well. All of the files had been copied from the PXE server, and the installer was downloading files from Ubuntu's security server. Then it stopped. I mentioned it to Christer and he said that his Internet connection had died too. We went to check on the PXE server (which was also playing the role of router) and realized that somebody had decided to reinstall it, to get it ready for class on Monday. My worst fear was coming true: there were problems with the install, and I might be without a computer for the next month.

I considered my options. Christer had not yet had backed up the Ubuntu PXE code, but the Red Hat code would be in-tact when the server came back. I've PXE installed RHEL5 more times than I can count, and I knew that I could get it working pretty quickly. Of course, I didn't know if my wireless network card was supported in Red Hat like it is in Ubuntu, and I wasn't looking forward to spending a month with an enterprise version of Linux on my personal computer. Then I realized that the installer had paused, and was giving me the option of retrying. The PXE server had already done its job, and my computer had everything it needed except for its security updates. All I had to do was wait for the Internet connection to come back, and assuming my computer didn't overheat and shut itself down again, I might be good to go.

The server took forever to install. Our auto-installer at work sets up a PXE install for multiple versions of Red Hat, SuSE and even OEL. When it finally came back, I pressed ENTER on the Ubuntu install and crossed my fingers. Half an hour later, I was ready to start customizing my brand new install of Ubuntu 7.10, aka Gutsy Gibbon.

The person who caused my pain (he knows who he is) will be forgiven soon. Until that point he knows that I am still mad at him, and he can safely assume that I am still shaking the fist of doom at him, even in my sleep. In the meantime, it's nice to finally have a completely working installation of Ubuntu again, and even nicer to have a working Perl install again too. No more installing Perl packages manually using make, no more installing Ubuntu/Debian packages manually using dpkg. The world is a happy place again.