Author: Lisa

PowerShell: Mass Active Directory Password Changes

We have a bunch of accounts that function as extra mailboxes — all conveniently housed in on OU. The following PowerShell command sets the password for all of the accounts in one go. Not terribly useful for “real world” use … but useful for testing (and probably something I’ll end up using again)

$OUpath = ‘ou=Mail Aliases,dc=example,dc=com’
$strNewPassword = “What3v3rYu0W@nt1tT0B3”

Get-ADUser -Filter * -SearchBase $OUpath | Set-ADAccountPassword -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $strNewPassword -Force)

Beany Soup

Ingredients:

  • Onion, diced
  • Garlic, minced
  • 1 tsp butter or olive oil
  • Ham bone or bones from smoked pork shoulder (not completely clean)
  • Dried bean assortment: pinto, red kidney, white kidney (cannellini), pink beans, great northern, baby lima, huge lima, black beans, green split peas, black-eye peas, yellow split peas, chickpeas, red lentils, green lentils
  • Smoked pork

Method:

In a pressure cooker, saute onions and garlic for a few minutes in butter or olive oil.

Remove from heat. Add about a pound of the bean mixture to a pressure cooker, add the bones (if using ham bone, don’t add salt; if using pork bones, add salt), then fill the pot with water to slightly under halfway. Pressure cook on high for about 35 minutes. Allow to naturally depressurize.

Liquid should be thickened from the beans cooking and flavored from the bones. Remove the bones and add more salt as needed.

Add smoked pork, and stir to combine. Allow to simmer until pork is heated.

Notes: We keep containers of various dried beans and peas. They’re really cheap, keep practically forever (especially since we got the vacuum sealer attachment that seals up Ball jars!), and cook fairly quickly in the pressure cooker. For this dried bean mixture, I just grabbed about half a cup of all of the larger beans and a quarter cup of the smaller split peas and lentils. In total, it’s about a pound of dried beans.

For Anya — Bill of Rights QuickRef

Since Anya is working on memorizing the Bill of Rights, I wanted a really quick list for her to review:

  1. Religion, speech, press, assembly, and petition government for redress
  2. Keep and bear arms
  3. No quartering soldiers
  4. Freedom from unreasonable search and seizure (secure in person, house, papers)
  5. Right to due process, freedom from self incrimination, no double jeopardy
  6. Right to speedy trial, public trial, jury of peers
  7. Right to trial by jury in civil cases
  8. Freedom from excessive bail, cruel and unusual punishment
  9. Other rights reserved for people
  10. Other rights reserved to states

Anya’s 11th Birthday Cake: Orange Chocolate

This year, Anya wanted an orange cake decorated with pieces of orange … but she also wanted chocolate. So we made an orange chocolate cake with orange chocolate buttercream. Very tasty!

Chocolate Orange Cake

  • 2 cups all purpose flour
  • 1 1/2 cup sugar
  • 3/4 cup cocoa powder
  • 2 tsp baking soda
  • 3/4 tsp baking powder
  • 1 tsp salt
  • zest of two oranges
  • 1 cup buttermilk
  • 1/2 cup vegetable oil
  • 1 cup decaffeinated coffee, cooled
  • 4 medium eggs

Preheat oven to 325F. Butter and flour two 8″ cake pans.
Whisk all dry ingredients (including orange zest) together.
Whisk all wet ingredients together.
Slowly stir wet ingredients into dry ingredients.
Pour batter into pans and bake for 35-40 minutes.
Remove from oven, allow pans to cool for approx 15 minutes, then turn cakes onto cooling rack to cool completely.

Chocolate Orange Buttercream Frosting

  • 2 cups unsalted butter
  • 1 Tbsp orange emulsion
  • 1/8 tsp salt
  • 5 cups powdered sugar
  • 1/2 cup heavy whipping cream
  • 10 oz dark chocolate chips

Whip the butter in the blender until light and fluffy. Add orange emulsion and salt.
Heat the whipping cream, remove from heat, and stir in chocolate chips to melt.
Slowly sift powdered sugar into butter while continuing to blend on lowest speed.
Once powdered sugar has been incorporated, add melted chocolate a scoop at a time and continue to blend on lowest speed until it has all been incorporated.

General Tao’s … Turkey

Ingredients

  • Four turkey thighs, deboned and cut into bite-sized pieces
  • 2 Tbsp Shaoxing wine
  • 1/2 cup stock
  • 1/2 tsp salt
  • 1/2 tsp ground pepper
  • 1 Tbsp sesame oil
  • 1/4 cup sesame seeds
  • 1/4 cup all purpose flour
  • 3/4 cup corn starch

Combine all ingredients except turkey and mix into a thick paste. Then fold in turkey pieces and coat well.

Add a handful of chili peppers to the oil before frying — the turkey is fried in chili oil. Fry, remove from oil, and drain on paper towel.

Sauce:

  • 1 cup stock
  • 1/2 cup soy sauce
  • 1/2 cup maple syrup or brown sugar
  • 2 Tbsp rice wine vinegar (or apple cider vinegar)
  • 2 Tbsp Shaoxing wine
  • 2 Tbsp corn starch

Combine all sauce ingredients in a sauce pan and heat until thickened. Serve with a veggie (roasted broccoli, garden peas) and rice. I sprinkled ground Aji Lemon Drop pepper powder over the rice, sauce, and peas. Then topped with fried turkey to keep it crispy.

 

Causes Unknown

I keep hearing that Nikki Haley failed to mention slavery as a cause of the civil war  at this New Hampshire town hall. She *did* mention slavery as a cause, she just did so in coded speech common among racists.

 

States rights!

The state’s right to do what?

Why, the right to make their own laws and do what is right for that state!

OK, but like an example of one of these laws other than forcing people into slavery?

Umm … oh, wow. Will you look at the time! Gotta go!

 

I lived in the US south for years and had some version of this conversation so frequently it was depressing.  There were other rights – South Carolina trying to nullify federal tariffs was a problem in the lead up to the war, too. But (1) hardly the biggest concern and (2) literally not something I’ve ever found a modern states rights person mention. That’s more the realm of civil war historians.

Crochet Project: Anya Scarf

Anya taught me how to knit, and I am slowly knitting her a scarf … but it’s more of a fancy going out scarf than a “keeping warm” scarf. I found the same yarn that I am using for our sofa blanket in a variegated color (Tidepool), and I used that to make a really warm scarf. I started off knitting, but the Bernat Blanket yarn doesn’t knit well for me — I managed to get about three rows in after more than an hour of working on it! Took that out, grabbed a crochet hook, and used double crochet stitches. Two days later, voila! She’s got a warm, snuggly scarf. Just in time for … 60 degree weather. It’ll get cold eventually. And her scarf is standing by!

 

Python Code — Creating Title Images

Instead of allowing YouTube to randomly pick a frame to use as the preview image, I have always made a title image for the Township meetings I post to YouTube. At first, this was a manual (and thus time consuming for a lot of videos). In the interim, I have created a script that generates the color gradient background and overlays text including the meeting type and date.

# Valid meeting types: "TrusteeRegular",  "TrusteeSpecial", "TrusteeEmer", "TrusteeHearing", "BZAReg", "BZAHearing", "ZCReg", "ZCHearing"
strMeetingListSpreadsheet = 'MeetingList.xlsx'

from PIL import Image, ImageDraw, ImageFont
import pandas as pd

BLACK= (0,0,0)
WHITE = (255,255,255)

TRUSTEE_COLOR_PALETTE = [(156,12,12), (92,7,7), (0,0,0)]
BZA_COLOR_PALETTE = [(253,139,1), (91,51,0), (0,0,0)]
ZC_COLOR_PALETTE = [(24,113,56), (8,41,20), (0,0,0)]
MISC_COLOR_PALETTE = [(175,28,195), (55,9,61), (0,0,0)]

objFontMeetingTitle = ImageFont.truetype("/usr/share/fonts/liberation-sans/LiberationSans-Regular.ttf",115)
objFontMeetingTopic = ImageFont.truetype("/usr/share/fonts/liberation-sans/LiberationSans-Regular.ttf",115)
objFontMeetingDate = ImageFont.truetype("/usr/share/fonts/liberation-sans/LiberationSans-Italic.ttf",95)

class Point(object):
    def __init__(self, x, y):
        self.x, self.y = x, y

class Rect(object):
    def __init__(self, x1, y1, x2, y2):
        minx, maxx = (x1,x2) if x1 < x2 else (x2,x1)
        miny, maxy = (y1,y2) if y1 < y2 else (y2,y1)
        self.min = Point(minx, miny)
        self.max = Point(maxx, maxy)

    width  = property(lambda self: self.max.x - self.min.x)
    height = property(lambda self: self.max.y - self.min.y)

def gradient_color(minval, maxval, val, color_palette):
    """ Computes intermediate RGB color of a value in the range of minval
        to maxval (inclusive) based on a color_palette representing the range.
    """
    max_index = len(color_palette)-1
    delta = maxval - minval
    if delta == 0:
        delta = 1
    v = float(val-minval) / delta * max_index
    i1, i2 = int(v), min(int(v)+1, max_index)
    (r1, g1, b1), (r2, g2, b2) = color_palette[i1], color_palette[i2]
    f = v - i1
    return int(r1 + f*(r2-r1)), int(g1 + f*(g2-g1)), int(b1 + f*(b2-b1))

def horz_gradient(draw, rect, color_func, color_palette):
    minval, maxval = 1, len(color_palette)
    delta = maxval - minval
    width = float(rect.width)  # Cache.
    for x in range(rect.min.x, rect.max.x+1):
        f = (x - rect.min.x) / width
        val = minval + f * delta
        color = color_func(minval, maxval, val, color_palette)
        draw.line([(x, rect.min.y), (x, rect.max.y)], fill=color)

def vert_gradient(draw, rect, color_func, color_palette):
    minval, maxval = 1, len(color_palette)
    delta = maxval - minval
    height = float(rect.height)  # Cache.
    for y in range(rect.min.y, rect.max.y+1):
        f = (y - rect.min.y) / height
        val = minval + f * delta
        color = color_func(minval, maxval, val, color_palette)
        draw.line([(rect.min.x, y), (rect.max.x, y)], fill=color)


if __name__ == '__main__':
    df = pd.read_excel(strMeetingListSpreadsheet, sheet_name="Sheet1")

    df = df.reset_index()  # make sure indexes pair with number of rows

    for index, row in df.iterrows():
        strGraphicName = f"{row['Date'].strftime('%Y%d%m')}-{row['Type']}.png"
        strMeetingType = row['Type']

        # Draw a three color horizontal gradient.
        region = Rect(0, 0, 1920, 1080)
        width, height = region.max.x+1, region.max.y+1
        image = Image.new("RGB", (width, height), BLACK)
        draw = ImageDraw.Draw(image)

        # Add meeting title
        if strMeetingType == "TrusteeRegular":
            horz_gradient(draw, region, gradient_color, TRUSTEE_COLOR_PALETTE)
            draw.text((1670, 525),"Trustee Regular Meeting",WHITE,font=objFontMeetingTopic, anchor="rm")
        elif strMeetingType == "TrusteeSpecial":
            horz_gradient(draw, region, gradient_color, TRUSTEE_COLOR_PALETTE)
            draw.text((1670, 525),"Trustee Special Meeting",WHITE,font=objFontMeetingTopic, anchor="rm")
        elif strMeetingType == "TrusteeEmer":
            horz_gradient(draw, region, gradient_color, TRUSTEE_COLOR_PALETTE)
            draw.text((1670, 525),"Trustee Emergency Meeting",WHITE,font=objFontMeetingTopic, anchor="rm")
        elif strMeetingType == "TrusteeHearing":
            horz_gradient(draw, region, gradient_color, TRUSTEE_COLOR_PALETTE)
            draw.text((1670, 525),"Trustee Public Hearing",WHITE,font=objFontMeetingTopic, anchor="rm")
        elif strMeetingType == "BZAReg":
            horz_gradient(draw, region, gradient_color, BZA_COLOR_PALETTE)
            draw.text((1670, 525),"BZA Regular Meeting",WHITE,font=objFontMeetingTopic, anchor="rm")
        elif strMeetingType == "BZAHearing":
            horz_gradient(draw, region, gradient_color, BZA_COLOR_PALETTE)
            draw.text((1670, 525),"BZA Public Hearing",WHITE,font=objFontMeetingTopic, anchor="rm")
        elif strMeetingType == "ZCReg":
            horz_gradient(draw, region, gradient_color, ZC_COLOR_PALETTE)
            draw.text((1670, 525),"Zoning Commission Meeting",WHITE,font=objFontMeetingTopic, anchor="rm")
        elif strMeetingType == "ZCHearing":
            horz_gradient(draw, region, gradient_color, ZC_COLOR_PALETTE)
            draw.text((1670, 525),"Zoning Commission Hearing",WHITE,font=objFontMeetingTopic, anchor="rm")
        else:
            horz_gradient(draw, region, gradient_color, MISC_COLOR_PALETTE)
            draw.text((1670, 525),"Township Meeting",WHITE,font=objFontMeetingTopic, anchor="rm")

        # Add township and date
        draw.text((1070, 225),"Hinckley Township",WHITE,font=objFontMeetingTitle, anchor="rm")
        draw.text((1770, 825),row['Date'].strftime('%B %d, %Y'),WHITE,font=objFontMeetingDate, anchor="rm")

        image.save(strGraphicName, "PNG")
        print(f"image saved as {strGraphicName}")


I have an Excel file which contains the meeting type code, a long meeting title that is used as the second line of the image, a date (and a MeetingDate that I use in my concat formulae that create the title and description for YouTube). To use an Excel date in concat, you need to use a TEXT formula with the text formatting string.

This allows me to have a consistent preview image for all of our postings without actually making dozens of files by hand.

Christmas Cookies

We made lots of maple cookies for Christmas — two different types, each of which has a full cup of maple syrup in it!

Anya cut shapes for the gingerbread.

We have lots of maple leaves, 5’s, cats, and seahorses. And some gingerbread people.

 

Cakey Maple Cookies

  • 1 cup all-purpose flour
  • 1 tsp baking soda
  • 1 tsp baking powder
  • 3 cup rolled oats
  • 1 large egg
  • 1 cup maple syrup
  • 1 1/2 cup Greek yogurt

Preheat oven to 350F. Sift together the dry ingredients excluding the oats. In a different bowl, combine eggs, maple, and yogurt. Mix into the dry ingredients, then stir in oats. Put about a tablespoon of batter per cookie on a sheet, and bake for about 25 minutes. Remove from tray and allow to cool.

Maple Gingerbread (Needs more ginger and cinnamon!)

  • 3 1/2 cups all purpose flour
  • 1 tsp baking powder
  • 1/2 tsp salt
  • 1 Tbps ground cinnamon
  • Tbps ground ginger
  • 1 cup dark maple syrup
  • 1/2 cup unsalted butter, melted
  • 1 egg

Sift dry ingredients together. Combine butter, maple, and egg. Stir into dry ingredients. Form into a ball. Refrigerate for a few hours.

Preheat oven to 350. Roll out dough, cut shapes, and cook for about 15 minutes. Remove from tray and allow to cool