Wednesday, September 01, 2010

Why I always brine meat

Normally meat loses about 30 percent of its weight during cooking. This is because as meat cooks the fibers bind to each other more tightly, which forces out moisture. Also, as the meat cooks and the proteins bunch up the meat shrinks. That's why it's important to rest meat before you serve it. It gives the protein time to relax and the juices flow back into the meat. You can exert some control on this process by brining the meat.

Here is what happens: The salt in the brine causes some of the proteins to break down, or denature. As the proteins denature the salt binds directly to them, which prevents the proteins from binding to each other when they cook. As the meat cooks and the muscle fibers tense up they can't grab other muscle fibers and wring out the moisture. The end result is a jucier steak, pork chop, chicken breast or piece of fish.

Did I just say fish? Why yes I did, because there is also an aesthetic reason for brining. Have you ever noticed when you cook meat -- but especially fish -- that some weird looking foamy white stuff comes out and looks like egg whites when it cooks? That's because it's the same protein that's in egg whites. As the muscle tenses up during cooking the albumin liquefies and gets forced out. This is the protein that brining breaks down. So if you brine your meats first this protein won't ooze out, giving you a nicer-looking end product.

Below is a chart showing some general guidelines for brining different meats.



I also brine steaks and roasts in a 10% by weight brine for 24 - 72 hours. That is 3.5oz salt to 1QT (32oz) water. (Technically it's 3.555 oz, I round down to make it easier on me. And yes, I use a scale.) You can add other ingredients to further enhance the flavor, such as garlic powder, onion powder, cardamom, cloves, tamarind powder, cayenne, preserved lemon, or just about any other spice. Just be careful about adding too much. Since it will get soaked into the meat you can end up with a very oddly flavored end result.

I find that meat brined in a lower sodium brine for longer is more tender and flavorful when cooked, but that's simply my observation. Your mileage may vary.

Image from http://www.finecooking.com/articles/why-brining-keeps-meat-moist.aspx. Check out that article for more information and tips on brining.

Friday, August 13, 2010

How not to do customer service

I order a lot of stuff from Newegg. They have good product selection, exclusive promos, and good pricing. On Monday of this week they had a 15% off promo on all keyboards. I had my eye on a Logitech G15, and the final price with the promo discount and shipping was $77. Considering it retails for $100 I felt good about my purchase.

On Wednesday Newegg had a new promotion: $20 off the Logitech G15 keyboard, with free shipping. This brought the final price down to $59. I was a little peeved about my Monday purchase so I did a web chat with Newegg to see if they could adjust the price.

In short: no. They offer no price protection and their policy is to not offer pricing adjustments. I explained to the customer service person that I could refuse delivery of the keyboard and order a new one, and even with the shipping charges and restocking fees I would end up saving money. We could avoid that situation -- and a lot of unnecessary costs and lost of customer goodwill -- if she would just offer the adjustment. Nope, that's not the policy.

I asked to have a manager call me, and she transferred the web chat to her supervisor. He copy and pasted the same policy to me. He did offer me $5 off my next order, which I never would have accepted, but by now I was pretty ticked off and found it insulting. I asked to have the order canceled and was told they couldn't do that since it was already shipped. I know shippers can recall orders from UPS, I've done it myself.

Unable to get any satisfaction from Newegg, I ordered another keyboard with the better promotions and put a note on my door refusing delivery of the first one. When it's all said and done I will have saved $9. At this point it's not the money, it's the principle.

Monday, July 19, 2010

Warning: SQL Server database files are not backwards compatibile

This is something I just learned the very hard way. Here's the scenario:

  • You have a database you created on SQL Server 2005 or 2008 SP1
  • You detach it from the SP1 server and attach it to SQL Server 2008 R2
  • You then try to reattach it back to the original server
  • You get an error about the server only supporting up to version 655 (or 612 for SQL Server 2005)
The reason is every version of SQL Server has its own file version number: SQL Server 2005 is file version 612; SQL Server 2008, either RTM or SP1, is file version 655; and SQL Server 2008 R2 is file version 660. As soon as a server touches a file it upgrades it to that server's file version. In this case once you attach the database file to SQL Server 2008 R2 it's version 660. SQL Server can read files that are at the server's version number or lower, so you can't take a SQL Server 2008 R2 database file and attach it to any prior release.

It isn't uncommon for a new releases of server software to have a new file format to support new features. The problem is SQL Server gives you no option to go back. You can't do a backup and restore, either, because the newer backup file cannot be read by the older server. At this point your only option is to create a new database and copy the data across. Due to customer outcry over SQL Server 2000 to 2005 migrations Microsoft added a scripting feature in SQL Server 2008 that can copy the structure and the data. For my 6GB database it generates 20GB of scripts that take nearly three hours to run.

For most people it isn't that big of an issue. I'm in the process of testing a migration from SQL Server 2005 to SQL Server 2008 and wanted to use the same data on both versions. Microsoft has made this scenario incredibly difficult.

Sidebar: Most Domino releases include a new file version, which is called the on disk structure or ODS. Domino does not automatically upgrade to the new ODS so you can decide when to upgrade. You can also downgrade ODS versions by using "compact -R". I would much prefer this to Microsoft's forcing the issue and not giving you any reasonable downgrade options.

Thursday, May 20, 2010

Tip for VMWare Workstation on Windows 7 Enterprise

I'm running VMware Workstation 6.5* on Windows 7 Enterprise 64-bit. It works well but I keep getting the dreaded warning about the clock speed not matching. To fix this it's usually a matter of just updating the config.ini, as documented here.

Except that under Windows 7, you can't save the config.ini. In fact, you can't write to the C:\ProgramData folder at all. Not even if you change the owner of the folder to your account. So what do you do? You have to temporarily change the User Account Control settings to Never Notify.

Go to Start Menu -> Control Panel -> User Accounts and Family Safety -> User Accounts.

Select User Accounts

Select Change User Account Control Settings

Move the slider all the way to the bottom

Now restart your computer. Once it comes back up you should be able to edit the config.ini. After you are finished you should kick the UAC back up at least one notch.

* VMware Workstation 7 uses a different method for determining host CPU speed and does not need this manual adjustment.

Friday, April 30, 2010

Dining With Friends 2010 recipes

I have the recipes for this year's Dining With Friends event online. They're in ODT format, which should make some of you happy. I don't have Word or Excel installed on my home computer anymore. I was delighted to discover that box.net has a built-in file viewer for them. :-)

Dining With Friends 2010 - A Trip to Germany

Wednesday, April 28, 2010

New Massachusetts data security law

Have you heard about Massachusetts law 201 CMR 17.00? It went into effect on March 1, 2010, but seems to have flown under most of the reporting radars. If you store personally identifiable information (PII) about a Massachusetts resident, it affects you. It doesn't matter where you live. Here is how the law defines personal information:

A Massachusetts resident's first name and last name or first initial and last name in combination with any one or more of the following data elements that relate to such resident: (a) Social Security number; (b) driver's license number or state-issued identification card number; or (c) financial account number, or credit or debit card number, with or without any required security code, access code, personal identification number or password, that would permit access to a resident’s financial account; provided, however, that “Personal information” shall not include information that is lawfully obtained from publicly available information, or from federal, state or local government records lawfully made available to the general public.
If you do store this information get ready for some fun. The information must be encrypted end to end during transmission and even when at rest. If you store the information on a portable device the whole device must be encrypted. You must file a written statement with the Massachusetts state government stating that you have a plan for dealing with information security. You don't have to file the plan itself, just the statement.

The fines associated with this law are massive. Someone steals a laptop with unencrypted data on 200 residents: that'll be $1,000,000 please. If you are discovered to be passing PII in clear text that will cost $5,000 per resident's information exposed. Write down a Massachusetts resident's PII and don't shred it -- that's $5,000, too.

I will readily concede a lot of this is common sense, but some of it will be onerous for a small business to implement.

Thursday, March 25, 2010

SnTT: A LotusScript StopWatch Class With Nanosecond Precision

I was doing some work in Access and wanted to time how long it took to do something. I was doing a small scale test so the timing was pretty minuscule. After poking around a bit I discovered a way to use the Windows API to count CPU clock cycles. I converted it to LotusScript since virtually nobody who reads my blog cares about Access. :-)

Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Double) As Long
Declare Function QueryPerformanceFrequency Lib "kernel32" (lpPerformanceCount As Double) As Long

Public Class StopWatch
Private m_StartTime As Double
Private m_EndTime As Double
Private m_Freq As Double
Private m_Overhead As Double

Private m_Days As Integer
Private m_Hours As Integer
Private m_Minutes As Integer
Private m_Seconds As Integer
Private m_Deci As Long
Private m_Centi As Long
Private m_Milli As Long
Private m_Micro As Long
Private m_Nano As Long

Private m_TotalSeconds As Single

Public Property Get Hours As Integer
Hours = m_Hours
End Property

Public Property Get Minutes As Integer
Minutes = m_Minutes
End Property

Public Property Get Seconds As Integer
Seconds = m_Seconds
End Property

Public Property Get Milli As Integer
Milli = m_Milli
End Property

Public Property Get Centi As Integer
Centi = m_Centi
End Property

Public Property Get Micro As Long
Micro = m_Micro
End Property

Public Property Get Nano As Long
Nano = m_Nano
End Property

Public Property Get TotalSeconds As Single
TotalSeconds = m_TotalSeconds
End Property

Public Sub StartTimer()
QueryPerformanceCounter m_StartTime
End Sub

Public Sub EndTimer()
QueryPerformanceCounter m_EndTime

Dim ElapsedTime As Double

ElapsedTime = (m_EndTime - m_StartTime - m_Overhead) / m_Freq
m_TotalSeconds = Csng(ElapsedTime)

m_Days = ElapsedTime \ 86400
If m_Days > 0 Then
ElapsedTime = ElapsedTime - m_Days * 86400
End If

m_Hours = ElapsedTime \ 3600
If m_Hours > 0 Then
ElapsedTime = ElapsedTime - m_Hours * 3600
End If

m_Minutes = ElapsedTime \ 60
If m_Minutes > 0 Then
ElapsedTime = ElapsedTime - m_Minutes * 60
End If

m_Seconds = Int(ElapsedTime)
If m_Seconds > 0 Then
ElapsedTime = ElapsedTime - m_Seconds
End If

m_Deci = Clng(Round(Clng(ElapsedTime * 10), 1))
m_Centi = Clng(Round(Clng(ElapsedTime * 100), 2))
m_Milli = Clng(Round(Clng(ElapsedTime * 1000), 3))
m_Micro = Clng(Round(Clng(ElapsedTime * 100000), 6))
m_Nano = Clng(Round(Clng(ElapsedTime * 1000000000), 9))

End Sub

Public Sub New()
Dim mStartTime As Double
Dim mEndTime As Double

'First figure out the API overhead
QueryPerformanceCounter mStartTime
QueryPerformanceCounter mEndTime

m_Overhead = mEndTime - mStartTime

'Now get the frequency
QueryPerformanceFrequency m_Freq
End Sub

End Class


This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.

Saturday, March 06, 2010

playing the hand you're dealt


To cut to the chase, I'll be starting classes at the Art Institute in July. Trust me, you couldn't possibly be any more surprised than I am.

By now you know I was selected as one of five finalists in a Food Network and Art Institutes scholarship contest, but I couldn't accept because the cost of acceptance was too high. The events that led from there to here still seem like a dream.

The contest rules state the scholarship can only be used for an associate or bachelor degree program, which cost $53,000 and $80,000, respectively. When I spoke with the contest coordinator I explained I couldn't cover the gap between the scholarship and the total cost of the degree. She took this back to the Food Network and AI, and they agreed to change the rules of the scholarship.

The Art Institute also offers a culinary arts certificate program, which is only three quarters long and only covers the core culinary classes. It also only costs $23,000, and I can cover $3,000 a lot more easily than $33,000, so I accepted the scholarship.

Even though I have known I was the winner for a while I was waiting for someone to pull the rug from under me. Stuff like this doesn't happen to me. As of yesterday, it's really official: Food Network Scholarship Announcement.

Sunday, February 07, 2010

what if 2000 characters could change your life?

In the Fall of 2008 Food Network aired The Chef Jeff Project. This show featured Jeff Henderson, a drug dealer and prison inmate turned chef who was trying to turn around the lives of six disadvantaged people in Los Angeles. The participants who completed the program were each offered scholarships to The Art Institutes culinary arts program. The Food Network also sponsored an essay scholarship contest for viewers, with a prize of $20,000 to the winner. I entered and never heard anything.

A year later, in Fall 2009, the Food Network was conducting their search for the next Iron Chef. In conjunction with this they did the same essay competition for another $20,000 scholarship to The Art Institutes. I thought back to my previous entry, and after seeing the ads for weeks I finally entered again. Weeks went by and I didn't hear anything, again, so I exhaled and went on with my life.

You can imagine my surprise when I got a call a few weeks ago and was told I'm one of the five finalists in the competition. Once I got over my shock I started looking more seriously at The Art Institutes. To be honest I had not looked at their curriculum... or their tuition costs. I was gobsmacked to learn that a two-year associates' degree program costs $53,000; a four year bachelor's degree is over $80,000.

The exorbitant cost made me take a hard look at what I want to do, as well as what I can afford to do. After a lot of soul-searching I finally decided not to pursue the scholarship competition. I appreciate getting as far as I did, I simply can't justify putting myself that far in debt.

I'm back to my old plan now, which is to pay off all my debt and attend culinary school in 2011. I'm going to continue experimenting and finding my culinary voice and point of view. Going through this got me thinking about how people are just as afraid of success as they are of failure. The first step truly is the hardest.

Friday, January 22, 2010

A cloud-based document sharing service that should be on your radar

I have been using box.net for a long time. They started out as another "me too" file sharing service. Over time they have adapted to the changing landscape and now have an incredibly compelling set of cloud-based document editing capabilities. I'm testing it out now and I'm very impressed. If you're in the market for cloud-based document sharing, box.net has an excellent toolset.