Stir-Fried Udon Noodles with Pork

Recipe Notes

  • Requires a large skillet.  Our 14″ cast iron is the perfect size.  It’s not quite a one-pot meal, because there’s a swap of ingredients in the middle, but it’s close.
  • Mirin is like sweet sake syrup.  The Japanese equivalent of cooking sherry, you should be able to find bottles of it in the grocery store.
  • The original recipe was pretty strict about amounts, but we’ve found that this recipe is pretty tolerant of variation.

Ingredients

  • 4 cups very coarsely chopped green cabbage (from about ¼ medium head)
    • Substitute 1 bag of dry slaw, 2 if you’re really feeling it
  • 2 x 7-ounce packages instant udon noodles
    • discard any flavor packets, if they’re included
  • 2 teaspoons toasted sesame oil
  • Ground pork, between a 1/2 and 1 pound
    • Substitute a similar amount of shiitake mushrooms to make this a vegetarian dish
  • Scallions, around a half-dozen
    • Chop the white parts
    • thinly slice the dark green parts and set aside for later
  • 2 teaspoons finely grated fresh ginger
  • 1 teaspoon crushed red pepper flakes
  • ⅓ cup mirin
  • ⅓ cup soy sauce
  • 1 tablespoon toasted sesame seeds, plus more for serving
  • Vegetable oil

Steps

  1. Put six cups of water on to boil while you work on step 2
  2. Heat 1 tablespoon of vegetable oil in a large skillet over medium-high. Add cabbage and cook, tossing often, until edges are browned, about 4 minutes. Reduce heat to low and continue to cook, tossing often, until thickest parts of cabbage leaves are tender, about 4 minutes longer. Remove from heat and set skillet aside.
  3. While the cabbage is finishing on low heat:
    1. Place udon in a large heatproof bowl (or pot if you don’t have one) and cover with 6 cups boiling water. Let sit 1 minute, stirring to break up noodles, then drain in a colander.
    2. Transfer noodles back to bowl and toss with sesame oil.
  4. Transfer cabbage to bowl with noodles. Wipe out skillet.
  5. Heat 1 tablespoon of vegetable oil in same skillet over medium-high and add pork, breaking up and spreading across surface of pan with a spatula or tongs.
  6. Cook pork, undisturbed, until underside is brown, about 3 minutes. The pork will never brown if you’re fussing with it the whole time, so when we say “undisturbed,” that means keep your paws off it and let the heat of the pan and the pork do their thing.
  7. When pork is browned, break up meat into small bits. Cook, tossing, just until there’s no more pink, about 1 minute.
  8. Add chopped scallions (the pale parts), ginger, and red pepper. Continue to cook, tossing often, until scallions are softened and bottom of skillet has started to brown, about 1 minute.
  9. Add udon mixture, mirin, and soy sauce and cook, tossing constantly, until noodles are coated in sauce (be sure to scrape bottom of skillet to dissolve any browned bits), about 45 seconds.
  10. Remove skillet from heat and fold in 1 tablespoon of sesame seeds and dark-green parts of scallions. Top with more sesame seeds before serving.

Adapeted from https://www.bonappetit.com/recipe/stir-fried-udon-with-pork

 

Quarantine: Reflections From Week 1

After the first full week of quarantine, some observations.

  1. The public has gone completely crazy.

    By last weekend people had purchased all available stocks of toilet paper, paper towels, kleenex, and ibuprofen. Store shelves were completely bare across the nation.There was no real shortage. Panic buying and speculation rules the day. Stores have mercifully instituted per-person maximum purchases to ensure availability for the unlucky or slow-to-act, so paper products are starting to trickle back onto the shelves.

    whateverToday the shortages are pasta, rice, french fries, and pepperoni. We couldn’t find any presliced pepperoni in Market Basket.

    The veggie aisle continues to be well-stocked, except bananas. (but that’s not completely out of the ordinary.)
  2. Unemployment claims are rising precipitously.  Experts are warning that we could reach 20% unemployment this year.
  3. Street traffic has ticked up a bit.  Presumably people are starting to venture out, but not soon enough to save local small businesses.
  4. Restaurants are still closing, but takeout pizza joints are booming.

    We decided to relax and order pizza from Tremezzo’s Pizza last night.  Megh called in an order at 4:40 pm.  It took nearly an hour for pickup.
  5. Starbucks, as one of the last remaining food service businesses open, is at least as busy as before.  It’s limited to drive-thru and pre-order service (nobody allowed inside) and the line of cars just about reaches the main road.
  6. The kids actually wanted to go out for a drive.

    Last night we went across the street with our pizza and salad for a very fun dinner with Debbie and Tom, followed by a round of cribbage.

    mild shockWhen we got back home around 8 pm the kids asked us to go out for a drive.

    They haven’t been in a car for over a week.  They’ve been outside, but there’s nowhere to go so none of us have been further than the grocery store.  Their friends can’t come out.  It’s weird to go so long without going anywhere, I think it’s comforting to do something familiar like sit in the car.

    We swung by McDonald’s for a treat and just… drove around, the four of us.  We went out to North Reading, swung through Reading, and came home.  It’s weird, but I have to admit that it was relaxing to drive.

    Bonus: there were hardly any cars on the road.

Looking ahead, it seems that we might have to collectively hunker down for months, perhaps a year, perhaps more.

Family Chronicle: COVID-19

“The real winner of this pandemic are the nation’s dogs, who are experiencing unprecedented levels of People Being Home”

If you’re reading this far enough in the future, a bit of context may be needed.

As SARS-CoV-2 entered the United States a few weeks ago, we collectively looked at the ongoing experiences of China and Italy and jokingly compared it to Captain Trips.  Meghan and I studied the history of the Spanish Flu looking for parallels and worst-case scenarios.

The lessons learned from 1918 are being applied by health officials right now, in an effort to avoid a healthcare-system-crushing pandemic.  We can’t avoid contracting the virus, that is clear, but perhaps we can prevent everyone from catching it all at once.

In the middle of last week schools in the Commonwealth of Massachusetts started closing as a preemptive measure.  Many businesses did as well, including my own.  A few did not until they were ordered to. This all mirrors the experiences (and failures) in other countries that were hit by the virus first.

dogs experiencing unprecendented levels of humans being home

As I write this, the governor has ordered all schools closed for at least three weeks.  Large gatherings are prohibited, originally capped at 250 people and now capped at 25.

“These gatherings include all community, civic, public, leisure, faith-based events, sporting events with spectators, concerts, conventions and any similar event or activity that brings together 25 or more people in single room or a single space at the same time.”

— Governor Charlie Baker, March 15 2020

The ban also prohibits eating at restaurants (take-out and delivery are still allowed).  By extension that essentially closes most bars, since you can’t take drinks to go.  Bars garnered a lot of bad press over the weekend as people noted lines “out the door” at many downtown Boston establishments.

So basically we could go out if we really wanted to, but there’s no where to go right now.

Grocery stores are still allowed to be open, so people can buy things eat, but the doomsday preppers have effectively cleaned the shelves.  Stores have struggled to keep essentials in stock, including (oddly) paper products like toilet paper, kleenex, and paper towels, as well as the true essentials that never spoil, like bread, milk, and eggs.  Meghan witnessed someone buying five gallons of milk on Saturday. It’s like snow is coming.

french toast alert system updates for corona virus

Some businesses are instituting, or are relying on, work-from-home policies; unfortunately others, especially service-oriented jobs, are sending people home without pay.

I’m fortunate that I can work from home.  We’ve cleaned out the office so I can get real work done, and made a spot for Butter to curl up.  Meghan’s situation is a little murky, but so far as we can tell she will continue to be paid for the duration.

The kids are starting to get remote assignments from school.  I expect the pace will pick up now that a longer, mandatory stay-at-home order is in place.  Some schools in harder-hit areas have stayed open because they support homeless and needy children, providing much-needed meals and warm places to wash up.

Baba has been asking for advice on what social events to attend.  (answer: zero.)  My own parents have continued to live like nothing has changed, though they’re a bit less social than Baba.  All three grand-parental-units are in multiple high-risk groups.  Connecticut has been less affected by the outbreak so far.  I’ve got my fingers crossed that they’ll come through without contracting it.

Bypassing a Tunnel-Broker IPv6 Address For Netflix

Surprisingly, it worked beautifully… that is, until I discovered an unintended side effect

My ISP is pretty terrible but living in the United States, as I do, effectively makes internet service a regional monopoly.  In my case, not only do I pay too much for service but certain websites (cough google.com cough) are incredibly slow for no reason other than my ISP is a dick and won’t peer with them properly.

This particular ISP, despite being very large, has so far refused to roll out IPv6.  This was annoying until I figured out that I could use this to my advantage.  If they won’t peer properly over IPv4, maybe I can go through a tunnel broker to get IPv6 and route around them.  Surprisingly, it worked beautifully.  GMail has never loaded so fast at home.

It was beautiful, that is, until I discovered an unintended side effect: Netflix stopped working.

netflix error: you seem to be using an unblocker or proxy
Despite my brokered tunnel terminating inside the United States, Netflix suspects me of coming from outside the United States.

A quick Google search confirmed my suspicion.  Netflix denies access to known proxies, VPNs, and, sadly, IPv6 tunnel brokers.  My brave new world was about to somewhat less entertaining if I couldn’t fix this.

Background

Normally a DNS lookup returns both A (IPv4) and AAAA (IPv6) records together:

$ nslookup google.com
Server:     192.168.1.2
Address:    192.168.1.2#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.12.142
Name:   google.com
Address: 2607:f8b0:4006:819::200e

Some services will choose to provide multiple addresses for redundancy; if the first address doesn’t answer then your computer will automatically try the next in line.

Netflix in particular will return a large number of addresses:

$ nslookup netflix.com 8.8.8.8
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: netflix.com
Address: 54.152.239.3
Name: netflix.com
Address: 52.206.122.138
Name: netflix.com
Address: 35.168.183.177
Name: netflix.com
Address: 54.210.113.65
Name: netflix.com
Address: 52.54.154.226
Name: netflix.com
Address: 54.164.254.216
Name: netflix.com
Address: 54.165.157.123
Name: netflix.com
Address: 107.23.222.64
Name: netflix.com
Address: 2406:da00:ff00::3436:9ae2
Name: netflix.com
Address: 2406:da00:ff00::6b17:de40
Name: netflix.com
Address: 2406:da00:ff00::34ce:7a8a
Name: netflix.com
Address: 2406:da00:ff00::36a5:f668
Name: netflix.com
Address: 2406:da00:ff00::36a5:9d7b
Name: netflix.com
Address: 2406:da00:ff00::23a8:b7b1
Name: netflix.com
Address: 2406:da00:ff00::36d2:7141
Name: netflix.com
Address: 2406:da00:ff00::36a4:fed8

The Solution

The key is to have your local DNS resolver return A records, but not AAAA, if (and only if) it’s one of Netflix’s hostnames.

Before I document the solution, it helps to know my particular setup and assumptions:

  • IPv6 via a tunnel broker
  • BIND’s named v9.14.8

Earlier versions of BIND are configured somewhat differently: you may have different options, or (if it’s a really old build) you may need to run two separate named instances.  YMMV.

Step 0: Break Out Your Zone Info (optional but recommended)

If your zone info is part of named.conf you really should put it into it’s own file for easier maintenance and re-usability. The remaining instructions won’t work, without modification, if you don’t.

# /etc/bind/local.conf
zone "." in {
        type hint;
        file "/var/bind/named.cache";
};

zone "localhost" IN {
        type master;
        file "pri/localhost.zone";
        notify no;
};

# 127.0.0. zone.
zone "0.0.127.in-addr.arpa" {
        type master;
        file "pri/0.0.127.zone";
};

Step 1: Add a New IP Address

You can run a single instance of named but you’ll need at least two IP addresses to handle responses.

In this example the DNS server’s “main” IP address is 192.168.1.2 and the new IP address will be 192.168.1.3.

How you do this depends on your distribution. If you’re using openrc and netifrc then you only need to modify /etc/conf.d/net:

# Gentoo and other netifrc-using distributions
config_eth0="192.168.1.2/24 192.168.1.3/24"

Step 2: Listen To Your New Address

Add your new IP address to your listen-on directive, which is probably in /etc/bind/named.conf:

listen-on port 53 { 127.0.0.1; 192.168.1.2; 192.168.1.3; };

It’s possible that your directive doesn’t specify the IP address(es) and/or you don’t even have a listen-on directive – and that’s ok. From the manual:

The server will listen on all interfaces allowed by the address match list. If a port is not specified, port 53 will be used… If no listen-on is specified, the server will listen on port 53 on all IPv4 interfaces.

https://downloads.isc.org/isc/bind9/9.14.8/doc/arm/Bv9ARM.ch05.html

Everything I just said also applies to listen-on-v6.

Step 3: Filter Query Responses

Create a new file called /etc/bind/limited-ipv6.conf and add the following at the top:

view "internal-ipv4only" {
        match-destinations { 192.168.1.3; };
        plugin query "filter-aaaa.so" {
                # don't return ipv6 addresses
                filter-aaaa-on-v4 yes;
                filter-aaaa-on-v6 yes;
        };
};

What this block is saying is, if a request comes in on the new address, pass it through the filter-aaaa plugin.

We’re configuring the plugin to filter all AAAA record replies to ipv4 clients (filter-aaaa-on-v4) and ipv6 clients (filter-aaaa-on-v6).

Now add a new block after the first block, or modify your existing default view:

# forward certain domains back to the ipv4-only view
view "internal" {
        include "/etc/bind/local.conf";

        # AAAA zones to ignore
        zone "netflix.com" {
                type forward;
                forward only;
                forwarders { 192.168.1.3; };
        };
};

This is the default view for internal clients. Requests that don’t match preceding views fall through here.

We’re importing the local zone from step 0 (so we don’t have to maintain two copies of the same information), then forwarding all netflix.com look-ups to the new IP address, which will be handled by the internal-ipv4only view.

Step 4: Include the New Configuration File

Modify /etc/bind/named.conf again, so we’re loading the new configuration file (which includes local.conf).

#include "/etc/bind/local.conf";
include "/etc/bind/limited-ipv6.conf";

Restart named after you make this change.

Testing

nslookup can help you test and troubleshoot.

In the example below we call the “normal” service and get both A and AAAA records, but when we call the ipv4-only service we only get A records:

$ nslookup google.com 192.168.1.2
Server:         192.168.1.2
Address:        192.168.1.2#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.3.110
Name:   google.com
Address: 2607:f8b0:4006:803::200e

$ nslookup google.com 192.168.1.3
Server:         192.168.1.3
Address:        192.168.1.3#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.3.110

 

SpeedSnail! Where are you?

I got a fish tank a year or so ago. It’s one of those Back to the Roots garden tanks that support a betta and three plant buckets. We had an alge problem, so we added a snail. He gets around a lot, so we call him the SpeedSnail.

(The fish is Fish Stick. It’s what was for dinner the night we brought him home.)

Yesterday, I noticed that the tank walls were getting a little brown. I decided today was the day to clear the counters and do some maintenance on the tank. The first part of that maintenance is to take out the plant pots.

So, I take out the middle pot. The roots are a little long, but not bad. Take out the far left pot. That one is ew and I may need to invest in new growth rocks. Then comes the one with the spider plant in it. This was an experimental plant. I look in the pot and notice one of the rocks looks strangely smooth. And round.

We collect shells. I have several snail shells from various beaches and our yard. So the obvious first thought is, “who put one of the shells in there?”

Then I look at the tank, and all the alge. I look at the tiger-striped shell in my pot. And SpeedSnail took a quick trip back into the tank.

He must have climbed up the feeding tube, gotten across the rocks, and discovered there was no water up there. He sealed himself up, and waited for the water to come back.

I watched him for a while before I left to meet Quinn for lunch, and spotted him sneaking a peak from inside his shell. When I got back to the house, he was busy hoovering up alge as fast as he could.

So, the snail had an adventure. The tank will get nice and clean again. FishStick can make aggressive moves against a tank-mate that can’t care less about what he’s doing.

All is well.

A project elided

After a few too many close calls, I approached the town about making our street and another into one-way lanes.  A counter-clockwise, 1.7 mile loop around the lake.

SilverLake, Wilmington MA
Silver Lake, bounded by Main, Lake, and Grove

The town said “no” for some very good reasons.  I knew they would, but I had to give it a try.  They paid the courtesy of taking it seriously, giving me a meeting with various officials, and explaining the reasons.

I had put an actual proposal together in case this went further.  I include it here for posterity.  Read it here: Better Traffic Around Silver Lake