Month: May 2020

Blueberry Mud Pies

The down side to ordering plants online is that you don’t have much control over when they arrive. I probably wouldn’t purchase a lot of shrubs a few days before a week of rain (I might because it saves watering new plantings … but that’d be some light rain, not a few days where we’ll be getting an inch or so per day). But we found ourselves with the blueberry bushes on Friday and twelve of the next thirteen days in the forecast calling for rain. With Sunday and Monday looking rather torrential.

Anya and I staked out where we were going to put plants. We locked a tape measure along the line we wanted for the row and she popped in a stake every 6 feet. And then again every 5.5 feet. The tape measure line let us get straight rows without a bunch of fiddling around.

Sometimes Anya was a blueberry plant … so I could see how they’d look once they grew?

The first challenge was figuring out some way to dig twenty holes in the ground — we had planned on renting a tiller from Home Depot (well, we wanted to buy one of those big 70’s beasts, but didn’t find a good price anywhere locally and figured the best prices on tillers are probably later in the year); but, without a truck, that also meant either losing the one sunny day until someone with a truck could help out or renting the truck too. I wondered if an earth auger could be used — seemed like basically the same function, but in a format that fits in the boot of our car. So we hired a one-person gas-powered auger from Home Depot.

I don’t have any experience in tool design, but industrial design projects in which I’ve participated have all involved both people sitting around and thinking about how the thing should work and prototyping to allow the intended users to test how it works “in the real world”. This auger seems to have skipped one of these steps. The throttle spins anticlockwise to “go”. Unfortunately, the direction of the machine’s spin when the auger bit gets stuck (i.e. the motor cannot turn the bit so the motor component starts spinning instead) means you increase the throttle as the machine rips at your arms. Obviously the idea is to release the thing, and I could see where “let’s increase the throttle when it’s stuck to help it power through that obstacle” might seem like a decent idea in a design meeting. But the real world result, for someone without the upper body strength to just hold the thing in place, is that your arms get whipped around along with the machine, your forearms smash into each other, and the whole thing just hurts. I operated the thing braced against my left hip to prevent its spin and still managed to get banged up.

My approach avoided the other design flaw — the exhaust blew directly into Scott’s face when he held it as it was intended to be held. That’s not a great experience when digging holes for a few hours. Design flaws aside, we were able to mangle up the ground for a third hop bed and mix in a bunch of compost pretty well. The auger bit had trouble when the tip is clogged with grass, but Scott was able to lean into it. Once it got into clay, it ripped right through it. Then we started on the blueberry field. We had initially planned on drilling nine holes in a grid for each plant. It took hours. On a overcast-but-still-sunny, 80 degree, humid day. Scott brought a bucket of water and a towel — we took turns boring holes so each of us got some rest/re-hydrate/cool off time, but it was going to take days to do 9 x 20 holes.

The biggest time suck was getting sod off of the auger bit so you could drill quickly. I wondered if we could dig the center hole and then angle the tool over to widen the hole. That worked wonderfully. We ended up with deeper holes than originally planned — the hole got deeper as the tool ran to widen out the hole — but loosening up more soil isn’t a bad thing. And we could drill around eight holes in the amount of time it took to do a set of nine for one plant. And, bonus, rotating the tool around in the clay cleared off the sod from the initial bore. We finished up just as the rain started and returned the tool. Took a break for a bit, got some dinner, and then hauled some compost over to mix with the clay from the hole. That was a terrible job. The clay was wet and difficult to mix in. We got two holes finished up before dark. And then it rained. And rained. And rained some more. There are standing pools of water in the yard, and each hole turned into a little pond. This, we thought, was going to be a challenge. We’ve got plants that need to get in the ground, so we cannot just wait for the rain to stop, wait another day, and give it a go.

It was actually easier than the just-wet-clay mixing we did on Sunday. Yesterday, we spent hours (6p-10p … so four hours) making the biggest mud pies ever. Used a shovel to clear out the mud that slid into the hole, then took a cart full of compost and threw a few scoops into the pond. Mixed it around, shoved in some clay from around the hole, mixed some more. It was soupy. Added a few shoves of compost and more clay, mixed … repeated a few times, the muddy clay/compost mixture started to thicken up. Water got pushed out of the hole and drained across the yard and over the ridge. And it was an Anya task — she helped me fill the cart with compost and worked on a mud pie of her own.

Once all of the clay was mixed with compost, we had nice mounds. The grass was easily scraped clean with a shovel (and rain will certainly get any little bits remaining). Then we topped the mound with a sprinkle of compost. I found a down side to working in water-proof Muck boots — rain that falls into the boot? Doesn’t go anywhere. I spent hours slogging around with a few cups of water inside my shoes! Also found that there are removable insoles, so our insoles are laying out and the boots are upside down in the garage to dry out.

Scott wanted to plant the bushes last night, but I wanted to give it all some time to dry out. By Tuesday morning, the mounds have drained out a little bit and we’ve got nineteen holes ready for blueberries! (we encountered and old root in one hole, so we’ve still got to chop that thing out.

Masking the Free Market

I’ve noticed that dedication to “free market” seems highly correlated to “you made the decision I support” … if we make an a priori assumption that requiring a mask be worn is somehow an infringement of individual liberties (not a stance I take, but accept it for the sake of argument), isn’t each individual’s ability to “vote with their dollars” a main tenant of the so-called ‘free market’?
 
I’m close to getting a Costco membership *because* they’re the only grocery joint around here that was making customers wear masks. It’s out of the way, I don’t think they’ve got the convenient order-online-drive-through-pickup thing, and I have no idea what their vegetarian selection is like. But I hate giving my money to support Giant Eagle’s lax enforcement of actual requirements (employee wearing mask does not mean around their neck) and refusal to require common-sense safety precautions like masks for customers. And that’s the free market. Enough people go one way or the other, the companies will change their stance.
 
And *forcing* a company not to require a mask violates that company-person (thanks, Citizens United) liberties too, doesn’t it?

Baked Breaded Fish

Baked Breaded Fish

Recipe by LisaCourse: FoodCuisine: AmericanDifficulty: Easy
Servings

4

servings
Prep time

30

minutes
Cooking time

20

minutes

Ingredients

  • 4 fillets of tilapia

  • Panko Mixture
  • 1 tablespoon sea salt

  • 1 cup panko bread crumbs

  • 1/3 cup shredded Parmesan cheese

  • Egg Mixture
  • 2 eggs

  • 1 tablespoon chili seasoning

  • 1 teaspoon salt

  • 1/4 cup oil

  • Flour Mixture
  • 1/2 cup all-purpose flour

  • 1 teaspoon salt

  • 1/2 teaspoon pepper

Method

  • Heat the oven to 425 F
  • Oil a baking tray
  • Blend the egg mixture ingredients in a bowl
  • Blend the flour mixture ingredients in a bowl
  • Blend the panko mixture ingredients in a bowl
  • Dip fish filet in flour mixture, then egg mixture. Then dip in panko mixture and press to ensure crumbs adhere to fish.
  • Place each filet on oiled baking tray
  • Using convection oven at 400 degrees F, bake for 15 minutes, turn fish, and bake for 5 more minutes

Notes

  • Serve with tartar sauce and lemon wedges

NodeJS Unit File

For future reference, this is an example unit file for running a NodeJS server with systemd. The NodeJS code we use reads from a local MariaDB, so I’ve added a service dependency for the database server.

Create /etc/systemd/system/nodeserver.service

[Unit]
Description=SiteName Node.js Server
Requires=After=mariadb.service

[Service]
ExecStart=/path/to/binary/for/node /path/to/nodeJS/html/server.js
WorkingDirectory=/path/to/nodeJS/html
Restart=always
RestartSec=30
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=nodejs-sitename
User=web-user
Group=www-group

[Install]
WantedBy=multi-user.target

Use systemctl daemon-reload to register the new unit file, then “systemctl start nodeserver.service” to start the service. Assuming everything works properly, use “systemctl enable nodeserver.service” to have the service start on boot.

Biffy Minestrone Soup Recipe

Biffy Minestrone Soup Recipe

Recipe by LisaCourse: DinnerCuisine: ItalianDifficulty: Easy
Servings

6

servings
Prep time

30

minutes
Cooking time

30

minutes

Ingredients

  • 3 Tbsp olive oil

  • 1/2 large onion, chopped

  • 15-20 baby carrots, sliced

  • 4 cloves garlic

  • 4 oz tomato paste

  • 1T chili garlic sauce

  • 1 cup potatoes, diced

  • 1/2 cup corn kernels

  • 1 cup green beans, diced

  • 1 tin cannelloni beans

  • 28 oz petit diced tomatoes

  • 4c broth

  • 2 tsp Italian spices

  • 1/2 tsp black pepper, ground

  • 1 cup elbow macaroni, cooked

Method

  • Put oil in pot and heat until shimmering. Add onion and carrot and saute for a few minutes.
  • Add garlic and heat until fragrant.
  • Stir in spices and heat until fragrant.
  • Add diced potatoes and saute for a minute.
  • Add in diced tomatoes, tomato paste, corn, cannelloni beans, and broth. Cook for 20 minutes
  • Add in green beans and cook for five minutes
  • To serve, add soup to bowl and stir in cooked elbow noodles.

Notes

  • Substitute whatever seasonal vegetables are available for corn and green beans

Chili Seasoning Blend

Chili Seasoning Blend

Recipe by LisaCuisine: MexicanDifficulty: Easy

Ingredients

  • 1/4 cup chili spice

  • 1 tsp roasted garlic powder

  • 1 tsp onion powder

  • 1/2 tsp crushed red pepper flakes

  • 1/4 tsp cayenne pepper

  • 2 tsp smoked paprika

  • 1 tsp oregano

  • 1 Tbsp salt

  • 1 Tbsp ground black pepper

Method

  • Combine all ingredients in a food processor and blend until powered.

Notes

  • I use this blend in my chili recipe and as the spice for taco/burrito fillings.

LDAP Authentication: Python Flask

This is a quick python script showing how the flask-ldap3-login module can be used to authenticate and gather user attribute values

from flask_ldap3_login import LDAP3LoginManager
from ldap3 import Tls
import ssl

config = dict()

config['LDAP_HOST'] = 'ad.example.com'

# Use SSL unless you are debugging a problem. Clear text port is 389 and tls_ctx needs to be removed from add_server call
config['LDAP_USE_SSL'] = True
config['LDAP_PORT'] = 636

# Base DN
config['LDAP_BASE_DN'] = 'dc=example,dc=com'

# User Base DN, prepended to Base DN
config['LDAP_USER_DN'] = 'ou=UserDN'

# Groups Base DN, prepended to Base DN
config['LDAP_GROUP_DN'] = 'ou=SecurityGroupDN'

# Server will be manually added to establish SSL
config['LDAP_ADD_SERVER'] = False

# Domain component of userprincipal name
config['LDAP_BIND_DIRECT_SUFFIX'] = '@example.com'

# Search scope needs to be subtree
config['LDAP_USER_SEARCH_SCOPE'] = "SUBTREE"

# Attributes to return
config['LDAP_GET_USER_ATTRIBUTES'] = ("mail", "givenName", "sn")

# Setup a LDAP3 Login Manager.
ldap_manager = LDAP3LoginManager()

# Init the mamager with the config since we aren't using an app
ldap_manager.init_config(config)

# TLS settings to establish trust without validating CA issuance chain. 
# Can use CERT_REQUIRED and ca_certs_file with path to cacerts that includes issuing chain
tls_ctx = Tls(
    validate=ssl.CERT_NONE,
    version=ssl.PROTOCOL_TLSv1,
    valid_names=[
        'ad.example.com',
    ]
)

ldap_manager.add_server(
    config.get('LDAP_HOST'),
    config.get('LDAP_PORT'),
    config.get('LDAP_USE_SSL'),
    tls_ctx=tls_ctx
)

# Validate credentials
response = ldap_manager.authenticate_direct_credentials('e0012345', 'P@s5w0rdG03sH3re')
print(response.status)
print(response.user_info)

Indoor hops?

Not really — but we’ve had a random week of nightly freezes since the hop plants arrived. Instead of planting them outside and keeping them covered, I’ve got them in the pots I use for seed starting and we’ll get them planted in the middle of this coming week. It was also a bit of an experiment — can you keep hop plants in little pots for a week?

Hops + 2 days

Hops + 5 days

They’re not growing anything like the hops out in the ground that we’re covering at night … but they appear to be doing well. And they should be happy enough until Wednesday when it looks like the cold snap ends.