Fu Pei-Mei’s Chinese Cook Book

Fu Pei-Mei’s (“the Julia Child of Taiwan”) 1969 cook book is a gem. Written in Traditional Chinese and English, it’s fun as a culinary rosetta stone but it is also an exhaustive treatment of traditional Chinese cooking. It’s out of print now but is available on the Internet Archive for free. Thank you Internet Archive!

Pei Mei’s Chinese Cook Book (300 pages)


  • Beef Stew Sze-Chuan Style (this is as good or better than what you can find in Taipei)
  • Ma-Po’s Bean Curd (this is better than any preparation I’ve ever had in a U.S. restaurant)

Update X-Plane navigation database for free

In the United States, you don’t need to buy a subscription from a navigation service provider to update the navigation waypoint and procedure database used by X-Plane.

X-Plane 11 and X-Plane 12 are capable of interpreting the FAA’s Coded Instrument Flight Procedures databases that are available online for free. These won’t give you the latest terrain elevation charts and obstacle databases, but for basic at-home instrument procedure training this is really all you need to match the latest charts, sectionals and FAA procedures.

  1. Visit the FAA CIFP download website, download the latest CIFP zip
  2. Extract the zip and copy the file FAACIFP18 to X-Plane’s Custom Data folder
  3. Rename FAACIFP18 to earth_424.dat
  4. Restart X-Plane

The “navigation data out of date” alert should no longer be present. If this is the first time you’ve done this procedure, you can also verify it worked by checking for the existence of a procedure that’s not in the stock version of X-Plane. (For example, try KLAS RNDRZ TWO arrival procedure which was updated 19MAY22).

Will AI language models make us smarter or dumber?

I think there’s a reasonable case to be made that language models will not make us smarter or dumber. They will offer no improvement to humanity overall, and this hype train will eventually pass. But part of me worries that they may actually freeze us in time.

These models are built by sampling a large set of writing (and images) at a fixed point in time. They are then optimized, with human guidance, to return “better” results. What is “better” is in the eye of the beholder(s), and is often determined by a market or economic incentive rather than what is objectively richer or more sophisticated response. There is an incentive with these systems to provide a result that appeals to the most people–it’s a race towards the median in the best case, (or a race to the bottom in the worst case).

We’ve seen this in many other domains: Movies. Music. Food. As the world has grown more connected and industries strive to serve the most number of people, originality is thrown by the wayside in favor of things that trigger the most user engagement and thus the most sales.

I have a slightly cynical outlook here based on my own past experience. In 2004 I started a music recommendation company. The idea was to help people explore The Long Tail, the edge, the art on the periphery that the mainstream wasn’t picking up. I felt that I had created a wonderful system, but what I discovered then was a fundamental truth that Apple Genius and Pandora discovered years later: most people do not want to explore the long tail. There’s comfort in the familiar. If you like 90’s country music then nine times out of ten you probably don’t want to be bothered with a recommendation to listen to a crossover ska-country fusion band, you just want to hear Garth Brooks.

Given these two forces: consumers wanting to be satiated by the familiar and producers wanting to make things that appeal to the widest audience, my concern is that AI language models will trigger a race towards the median in human knowledge.

Here’s a completely hypothetical example from a potentially not-to-distant future:

User: Who was Henry the 8th?

Computer: Henry VIII was King of England from 1509 to 1547. He had his first wife executed. His disagreement with the Pope led to the English Reformation. [Merchandise] [Quotes]

Compare this to what you get from Wikipedia today, and you’ll see there’s a lot of nuance left out in this answer and the writing style is far more sophisticated. This hypothetical answer is distilled down to only a few “essential” points, as determined by the optimizer(s).

In my view, this is already happening today on the Internet, even without AI language models. YouTube, WikiHow and a mess of other search-engine-optimized sites return wasteful, low-information-density garbage. Time consuming answers to even the simplest questions. When I read what ChatGPT-4 is producing, to me it feels like I’ve fallen into the worst corners of WikiHow-laden search results.

If we increase our reliance on AI generated responses, tuned in ways that appeal to the widest possible audience, it could make it harder for us–as a species–to gain new knowledge. For the future’s sake, I hope my fears prove to be unfounded.

Passive dismissals and the “impossible”

This is an internal memo I wrote in the earlier days of Reliable Robotics. I’m sharing it here publicly in case others find it useful.

Werner von Braun has this quote, “I have learned to use the word ‘impossible’ with the greatest of caution.” I’ve gone searching for the context in which he made this comment but haven’t uncovered yet where he said this or what it was in reference to. But having been part of several projects now that many (including myself) thought were impossible I get where he is coming from. When you prove others wrong once or twice in your career you start to become immune to passive dismissals of impossibility.

Possibility vs. impossibility is not just a glass-half-full vs. glass-half-empty, optimistic vs. pessimist issue. The differentiator here is energy, not mental outlook. It takes less energy to passively dismiss something as impossible than it does to dig in and understand how something might be possible. Understanding the possibility of something requires focus, thought and action.

When we started Reliable Robotics, we heard our fair share of passive dismissals:

  • It’s going to be impossible to get an aircraft flying itself with a small team…
  • It’s going to be impossible to get permission from the regulator…
  • It’s going to be impossible to get permission from an insurance underwriter…
  • It’s going to be impossible to get a customer…
  • It’s going to be impossible to get an investor…
  • etc., etc…

These claims often came from a place of intuition, with no rationale or thought placed in them. These are all easy claims to make, and proving them wrong takes time and energy. To be fair, we are yet to prove all of the passive dismissers wrong. But we have, in relatively short order, proven many of these claims to be terribly short-sighted.

Looking back, I credit our perseverance through this morass of negativity to all of the wonderfully successful “impossible” projects we’ve worked on in the past. With success, you build up a certain resistance to passive dismissals. You never become entirely immune, but you do learn to separate the credible objections from the non-credible, and how to objectively address the doubts and concerns without falling prey to the emotional response.

Success only gets you so far however (as those with imposter syndrome can attest)! And when you are starting at the beginning, or following a failure, you still need to be able to bootstrap your own partial immunity to passive dismissals. For me personally, I’ve discovered that I’m actually energized by naysayers. A former colleague once observed, “the best way to get a great engineer enthusiastic about a challenge is to bet them they can’t do it,” and this is definitely true for my personality. The “we’ll prove them wrong” outlook, if properly harnessed, can provide a solid foundation on which to make something possible.

Eventually, you learn to take pity on the doubters, the non-believers, the dismissers. They just haven’t had the good fortune of being part of an impossible project yet, or they are just too busy to dig in and challenge their own assumptions. Either way, in a world where we are literally not constrained to this world anymore–a world Werner von Braun helped create–it does surprise me that anyone would throw the word ‘impossible’ around so lightly.

Cherish the rigorous job interviews

Three times in my career I’ve rejected job offers because I didn’t feel the interview process was rigorous enough.

Straight out of school, the company did not ask me any challenging interview questions. I walked away thinking: “They’re not going to challenge me. I’m not going to grow working here.”

Another company did not ask me any questions about what I wanted or why I was interviewing with them in the first place. I walked away thinking: “This place has no soul. They’re not going to care about building my career.”

Later in my career, every interview focused on my resume and not much else. I walked away thinking: “Everyone here must just get hired based on their resume.”

This meme (above) has been making the rounds lately on reddit, and while I appreciate the sentiment behind it, I personally could not imagine accepting a job offer somewhere after a single interview, especially if I didn’t know anyone at the company. The market for talent is growing more competitive every day, but as a candidate you should consider if the company is looking to just put a warm butt in their seat, or actually help build your career.

To employers, a rigorous interview process should convey to a candidate a commitment to excellence in both who you let into the organization and how people will be treated once they join.

To candidates, understand that rigor means the employer cares about mutual alignment and shared success, and not just jumping through arbitrary hoops as the meme suggests.

Originally posted on LinkedIn Pulse.

Be Excellent To Each Other

In California, employers with 5 or more employees are required by law to provide at least one a hour of sexual harassment and abusive conduct prevention training for employees every two years.

We recently went through another round of this training at the office. A recurring theme from our team during and after the session was, “if you just be a good person you’re going to avoid many of these problems.” I was also impressed by feedback from our team that there are a lot of other types of unwanted behaviors you might encounter in the workplace well before you cross the “legal threshold,” and that we should try and articulate these to make clear to newcomers what is or is not tolerated at our company.

We thought it would be best to capture the spirit of this through a slogan or simple expression. Some companies talk about a “no jerks policy,” but we didn’t feel this was specific enough. We also weren’t sure about expressing it as a negative. We thought a more positive slogan like a “Golden Rule Policy” would work better but this is tricky given the strong history of this expression in religion. (And the fact that some people treat others genuinely the way they expect to be treated but are still acting like jerks)!

While searching for a better way to capture the type of behavior we wanted to encourage at the company we settled on “be excellent to each other,” as popularized by the cultural cornerstone movie and pinnacle of American cinema, Bill and Ted’s Excellent Adventure. It may sound light-hearted, but beneath the surface there is a deep wisdom about life to be learned from these time traveling heroes.

After some iteration, we came up with a simple scenario-based training module to help capture this for the team. Others may find this useful, so I’m making available to the public here: Link

Sodium Citrate Macaroni and Cheese

Recipes abound for sodium citrate based mac and cheese, but the ratios of cheese/water/sodium citrate are all different. Having tried several recipes with several different types of cheeses it’s been a bit perplexing that I always end up tweaking the recipe somehow, either by adding more cheese or adding more sodium citrate to help it go into emulsion. I believe the fat content of the cheese is a huge variable that you need to adjust for. Because Tillamook Medium Cheddar is plentiful here on the west coast, here’s a combination that works well it. No guarantee it works with other cheeses!

  • 1lb noodles
  • 1.5 lbs Tillamook Medium Cheddar, diced/sliced
  • 3 tsp sodium citrate
  • 2 cups water

Cook noodles and set aside.

Bring water to a boil, add sodium citrate and stir until it goes into solution. Reduce to medium high heat and slowly add cheese to water, stirring vigorously, until cheese reaches a smooth consistency. Remove from heat, add noodles and continue stirring to prevent it from burning.

Some recipes recommend you use an emulsion blender to mix the cheese sauce. BAD IDEA. You’ll be removing cheese bits from your blender for months and you’ll never want to make this again. A normal spoon works fine.

PROTIP: This recipe makes a mess! Melt the cheese and combine the noodles in the same pot to reduce cleanup. To quickly clean the pot combine more water and more sodium citrate and return it to a boil. It’s not quite self-cleaning but saves a lot of effort.

See also my old Macaroni and Cheese recipe.

Pellet smoker pulled pork

This recipe is so simple I feel silly writing it down, but it needs to be written down because so many recipes out on the internet for pulled pork are just wrong. Good pulled pork should be tender and juicy. It should almost melt-in-your-mouth. The smoke and pepper flavors should be intense. Great pulled pork does not require barbecue sauce.

You get tender and juicy by holding the pork at the right temperatures while cooking. Like the Texas Crutch, if you seal the pork from air after smoking it and before bringing it above boiling you’ll retain most of the moisture. A healthy amount of salt will help retain moisture during the smoke.

This recipe cooks the pork in two phases: low and slow in the pellet smoker followed by a higher-temperature period in a dutch oven.

Start by rinsing the pork shoulder and patting dry with paper towels. Cut the pork into 3-4″ chunks. (Don’t worry about removing the bone, it will fall out later). Then mix equal parts salt and pepper and thoroughly cover the pork with the salt and pepper blend.

Use salt and pepper where the granules are the same size, such as classic table salt and medium grind pepper. This is important, because salt and pepper of different sizes won’t mix together thoroughly and you’ll struggle getting the right balance.

Place the pork into your pellet smoker set to 150°F and let it go for at least 6 hours, I usually just set it up overnight for 8-10 hours.

Next, move the pork into a cast iron dutch oven and place it in the oven at 225°F for at least 4 hours. (If you have a crock pot large enough it also works to use a crock pot set on high, but more moisture tends to escape with a crock pot vs the dutch oven in my experience).

After 4+ hours in the dutch oven you should be able “pull” the pork using two regular table forks. If there is still a bone in the meat it should easily separate out. Separate all the pork, mixing it back with its own juices.

If the pork is not tender enough to separate give it another hour and try again. Resist the urge to increase the temperature on the oven–this will just dry it out. If you really can’t wait to eat it would be better for you to just eat it, as it’s already well-above a food safe temperature by now. But if you wait you will be rewarded.

Serve straight up on a plate with a side of beans and coleslaw, or serve on a classic white hamburger bun, slaw optional.

If your guests asks for barbecue sauce stare at them with an expression of horror on your face, and then calmly assert the pork does not require “sauce”. For extra kick it may be acceptable to add a little cayenne pepper, but I would recommend this be done sparingly and mixed into the dutch oven before serving.

Bread machine hamburger buns

In the spirit of Bread Machine Baguette, here is a simple shortcut recipe that automates most of the work with making hamburger buns from scratch. The extended poolish time isn’t required here (with the milk you don’t want it anyways), so the recipe only takes about 3 hours and requires very little preparation other than shaping the dough.

The first time I ate one of these I wondered if I would ever be able to go to a store and buy a hamburger bun again. Three months later, I still have not been able to buy hamburger buns from the store. I’m not even able to see them in the store anymore–I am almost completely blind to the entire grocery store bread section now. Because the bread machine cuts out so much of the preparation work (and cleanup) and the end product is just next-level better than anything you can buy (even at a top-end bakery) you will probably wonder the same thing after you try this. You have been warned.

Place in the bread maker, in roughly this order:

  • 1/2 cup water
  • 1/2 cup milk
  • 1 egg
  • 2 tbsp sugar
  • 2 tbsp vegetable oil
  • 1 tsp salt
  • 1 tsp dry yeast
  • 1 lb (450g) all purpose flour

Using the same programming as Bread Machine Baguette, set the bread machine up to do at least two, preferably three, rise cycles but no baking cycle.

When the rise cycles are complete, fariner your work surface, roll the dough and cut into eight equal portions. Shape into discs and place on a well greased baking pan (or silicone baking surface). In a separate bowl, whisk together:

  • 3 tbsp milk
  • 1 egg

and apply to the top of the dough. Optionally apply sesame seeds to the top (protip: “everything seasoning”) and bake at 375°F until golden brown.

Shaping the dough might take some practice. Treat it like making cookies or biscuits, except you’re shaping the cookie by hand. Don’t stress out “over working” the dough–having done this a few times with my kids I concluded it’s pretty hard to screw up. However if you would like guidance on how to shape the buns there are a number of youtubers that go through the technique.

If you want to go “full brioche” replace all of the water with milk and the vegetable oil with unsalted butter, and perhaps also add a second egg. You can’t go wrong by doubling the butter either, but the further you go down this path the more delicate (and weaker) the bun will be. It depends upon your objective: if you want a hearty bun that can hold up a 1/2 lb burger I would leave the recipe as it stands, but if you’re looking for something to pair with prosciutto, light mozzarella and arugula by all means crank the brioche to 11.