The Politics Of Anger

Michael Kruse interviewed people out in Johnstown PA who had voted from Trump last year to see what they think of his performance thus far. Objectively, someone who campaigned on Muslim bans, enormous walls along the Mexican border, bringing back the steel mills, and bringing back coal mining … well, just another politician promising the world and delivering nothing. But these people still love Trump. And would vote for him again. Why?

It seems like voters want someone to be angry along with them. There is no easy solution, there is no painless solution … but no one wants to hear the truth. Or hear hard answers. But someone who obviously lies to them but conveys a story of their own victimization … that’s where they’re voting.

Coconut Almond Chocolate Bars

I made a homemade dessert inspired by Almond Joy bars. It’s got three layers – coconut, sliced almonds, and either chocolate or carob.

For the coconut layer, combine the following in a food processor and pulse until you’ve got a somewhat creamy well blended mix.

3 cups unsweetened coconut flakes
1/4 cup coconut oil
1/2 cup coconut cream
1/4 cup maple syrup

Line a pie pan with clingfilm and press coconut mixture into pan. Top with sliced almonds.

I then made both carob and chocolate sauce to spread on top. Melt 1/4 cup of coconut oil. Add 2 tablespoons of maple syrup. Then stir in either cocoa powder or carob powder until the mixture has the consistency of melted chocolate.

Spread chocolate or carob (I made it with half chocolate and half carob). Refrigerate for an hour so the chocolate sets.

Containerized Development v/s Microservices

While both monolithic and microservice applications can be deployed in containers, there is a significant difference. Understanding that difference can save time/money/effort decomposing an application into microservices when the benefits you desire can be gained through simple containerized deployments.

One of the touted benefits of microservices — the ability for different teams to use different internal practices, different coding standards, hell even different languages and still have a functioning application because the interface is static and well documented … well, that sounds like a nightmare to me.

A company with which I worked a decade ago had teams of developers devoted to different components of the application — essentially your team owned a class or set of functions. The class/functions were had well documented and static interfaces — you wouldn’t change void functionX(int iVariable, string strOtherVariable) to return boolean values. Or to randomly add inputs (although functions were overloaded). Developers were tasked with ensuring backwards compatibility of their classes and functions. The company had a “shared libraries” development team who worked on, well, shared libraries. Database I/O stuff, authentication frameworks, GUI interfaces. A new project would immediately pull in the relevant shared functions, then start developing their code.

Developers were able to focus on a small component of the application, were able to implement code changes without having to coordinate with other teams, and consumers of their resource were able to rely on the consistent input and output of the functions as well as consistent representation of class objects.

When a specific project encountered resource shortfalls (be that family emergencies reducing workers or sales teams making overly optimistic commitments), the dozens of C# programmers could be shifted around to expand a team. In a team with an outstanding team lead, employees could easily move to other groups to progress their career.

What happens in a microservices environment? You’ve got a C# team, a Java team, a Python team. You get some guy in from Uni and he’s starting up a LISP team because Lisplets will get his code delivered through Tomcat. The next guy who comes in starts the F90 team because why not? Now I’m not saying someone with a decade of experience in Java couldn’t learn LISP … but you go back to “Google up how to do X in LISP” programming speed. There are language nuances of which you are not aware and you introduce inefficiency and possibly bugs to the code.

What’s my point? Well, (1) business practices (we program in this language, here’s our style guide, etc) are going to negate some of the perceived benefits of microservices. The small gain to be had by individual teams picking their own way are going to be outweighed by siloing (some guy from the Java team isn’t going to move into a lead role over on the C# team) and resource limitations (I cannot reallocate resources temporarily). But (2) you can architect your project to provide, basically, the same benefits.

Microservices make sense where an application has different components with different utilization rates. A product that runs a Super Bowl commercial may see a huge spike in web traffic — but scaling up thousands of complete web servers to handle the load is an inefficient use of resources. There’s a lot of product browsing, but shipping quotes, new account creations, and check-outs are not all scaling linearly to web hits. Adding tens of thousands of browsing components and only expanding the new-account-creation or checkout services as visitors decide to make purchases can be done more quickly to respond in real-time to traffic increases.

Applications where each component gets about the same amount of use … I use Kubernetes to manage a cluster of sendmail servers. As mail traffic increases, additional PODs are brought online. It’s a configuration I’d like to mirror at work — we currently have nine sendmail servers — to provide physical and site redundancy for both employee mail traffic and automated system traffic. With Kubernetes, three servers in each of the two sites (six total) would provide ample resources to accommodate mail flow. Automated systems send a lot of mail at night, and the number of pods servicing that VIP would increase. User mail flow increases during the day, so while automated mailflow pods would be spun down … user mail flow ones would be spun up. With a 33% reduction in servers, I’ve created a solution with more capacity for highly used functions (this function could be the primary usage of all six servers) that is geo-redundant (one of the current systems is *not* geo-redundant as the additional two servers in the alternate site couldn’t be justified). But I didn’t need to decompose sendmail into microservices to achieve this. Simply needed to build a containerized sendmail.

Load Runner And Statistical Analysis Thereof

I had offhandedly mentioned a statistical analysis I had run in the process of writing and implementing a custom password filter in Active Directory. It’s a method I use for most of the major changes we implement at work – application upgrades, server replacements, significant configuration changes.

To generate the “how long did this take” statistics, I use a perl script using the Time::HiRes module (_loadsimAuthToCentrify.pl) which measures microsecond time. There’s an array of test scenarios — my most recent test was Unix/Linux host authentication using pure LDAP authentication and Centrify authentication, so the array was fully qualified hostnames. Sometimes there’s an array of IDs on which to test — TestID00001, TestID00002, TestID00003, …., TestID99999. And there’s a function to perform the actual test.

I then have a loop to generate a pseudo-random number and select the test to run (and user ID to use, if applicable) using that number

my $iRandomNumber = int(rand() * 100);
$iRandomNumber = $iRandomNumber % $iHosts;
my $strHost = $strHosts[$iRandomNumber];

The time is recorded prior to running the function (my $t0 = [gettimeofday];) and the elapsed time is calculated when returning from the function (my $fElapsedTimeAuthentication = tv_interval ($t0, [gettimeofday]);). The test result is compared to an expected result and any mismatches are recorded.

Once the cycle has completed, the test scenario, results, and time to complete are recorded to a log file. Some tests are run multi-threaded and across multiple machines – in which case the result log file is named with both the running host’s name and a thread identifier. All of the result files are concatenated into one big result log for analysis.

A test is run before the change is made, and a new test for each variant of the change for comparison. We then want to confirm that the general time to complete an operation has not been negatively impacted by the change we propose (or select a route based on the best performance outcome).

Each scenario’s result set is dropped into a tab on an Excel spreadsheet (CustomPasswordFilterTiming – I truncated a lot of data to avoid publishing a 35 meg file, so the numbers on the individual tabs no longer match the numbers on the summary tab). On the time column, max/min/average/stdev functions are run to summarize the result set. I then break the time range between 0 and the max time into buckets and use the countif function to determine how many results fall into each bucket (it’s easier to count the number under a range and then subtract the numbers from previous buckets than to make a combined statement to just count the occurrences in a specific bucket).

Once this information is generated for each scenario, I create a summary tab so the data can be easily compared.

And finally, a graph is built using the lower part of that summary data. Voila, quickly viewed visual representation of several million cycles. This is what gets included in the project documentation for executive consideration. The whole spreadsheet is stored in the project document repository – showing our due diligence in validating user experience should not be negatively impacted as well as providing a baseline of expected performance should the production implementation yield user experience complaints.

 

Curried Salad

I made a really good curried salad based on a recipe I found online. I omitted the sriracha from the sauce and used a little of Penzey’s Bangkok Blend to add a little flavour and heat. I also poached a salmon filet (for Anya and I) and some chicken (for Scott). Flaked / shredded the meat and coated it in the sauce. Then I made the salad (without cilantro), drizzled with the curried peanut sauce, added the meat, and topped with some crunchy noodle things.

Halloween Flatbreads

We volunteered to make the ‘healthy snack’ for the preschool class Halloween party again this year. We made pumpkin-shaped flat breads with carrot hummus.

Flat Bread Recipe:

4t active dry yeast
1t Penzey’s roast garlic powder
2t Penzey’s italian herbs
1t sea salt
1t sugar
4 cups all purpose flour
2T olive oil
1.5 cups water
1 large carrot, shredded finely

Combine all of the dry ingredients and mix, then add in water and oil. Kneed until it becomes a smooth and stretchy dough. Add carrot shreds and kneed to distribute throughout dough. Allow dough to rise until doubled (at least an hour).

Heat electric griddle to 375 F. Roll pieces of dough to ~1/8″ thick and cut with pumpkin-shaped cookie cutter. Cook for 2-3 minutes on each side.

Carrot Hummus Recipe:

1c dried garbanzo beans – in a pressure cooker, add about 1/2 teaspoon baking soda, 1 teaspoon salt, and water. Cook at high pressure for 45 minutes. Add about a pound of carrots and cook for another 15 minutes.

In a food processor, combine 1/4c fresh lemon juice and 1/4c tahini. Pulse to combine. Fill with garbanzo beans and carrots, and blend until smooth.

We topped the flatbreads with the orange-coloured hummus to make pumpkin flatbreads:

On Compromise And The Civil War

Claimeth John Kelly: “But the lack of an ability to compromise led to the Civil War, and men and women of good faith on both sides made their stand where their conscience had them make their stand”.

Yes, John Kelly, rich white dudes refusing to compromise their profits for human decency totally caused the civil war. Now let’s address all the things rich white dudes refuse to compromise their profits for today … sustainable production, livable environment, human decency, REALITY.

News Dump

Almost a year ago, everyone knew some primary challenger funded opposition research, terminated the contract when Trump secured the nomination, and then someone on the Democratic side picked up the tab to continue research. We got names to go with it last week, and somehow that was meant to indicate Clinton colluded with Russia. Or something. Alternative logic using alternative facts really isn’t my thing.

And then we were treated to the criminal collusion of … half a dozen disparate government agencies approving the sale of domestic uranium resources (with a stipulation against export, although if a gun law wouldn’t stop a mass shooting … I guess export restrictions wouldn’t stop a nuc either).

And for a short time this morning, I thought they were a distraction from Manafort’s indictment. But it didn’t make sense – for one, the due was warned some time ago. I guess he expected a three day countdown warning or something, but it wasn’t a secret that something was coming against him.

Then the Justice Department slipped a plea agreement into their filing database. A plea agreement with a Trump campaign official who lied to the FBI about attempting to collude with the Russian government to support Trump’s campaign. Shortly before Jr & co met with the ‘totally not Kremlin connected Russian lawyer’ about ‘adoptions that totally had nothing to do with American policy related to Russia’.

Reading through the plea agreement (https://www.justice.gov/file/1007341/download) … the offense level is 4, which (baring the chap having a prodigious criminal history) is a 0-6 month sentence with the possibility of fines up to 10k. Not a bad deal for a crime that yield up to five years imprisonment *and* 250k in fines. Total speculation on my part, but I think he’s agreed to testify against someone notable.

Peppermint Swirl Dress – Almost Finished!

I had put the peppermint swirl dress on hold whilst making her lion costume; now that Halloween costumes are all sorted, I wanted to try assembling this thing. It seems quite intimidating – fourteen different slices in the skirt, all curves. And the strips look too long. I know the instructions said the whole thing would look off until you attached the first and last slices to make a whole circle … but holding a single strip up against my tiny person, I thought this might be an adult-sized skirt. In fact, I think you could use one of the larger child size patterns to make a short adult skirt. There’s a lot of gathering to the bodice, and her size 6 fit around my waist.

I used Moda Marbles in vanilla and indigo. No matter how silly it sounds, I was quite paranoid about attaching the strips in the wrong order. And I’m only working with two colours! But someone else who makes these dresses posted her technique — stacking the fabric in the order it would be used, then just pulling the next piece of fabric off the pile as she assembles the skirt. Perfect! I could double-check the order — asked Anya to tell me the colours, and listed for the alternation.

Anyway, assembly looks intimidating. You’ve cut twenty-eight segments and attached them together into fourteen individual strips. That’s a big pile of fabric. The whole thing came together quickly – like thinking I must have done something wrong quickly. This is certainly a serger project – it’s a lot of seams, and I would be devastated to spend this much time cutting and assembling a project (and five yards of fabric, even cheap fabric, adds up) only to have seams fray after a few uses. With a serger, though, I was able to assemble the entire thing in a couple of hours . The arc of each slices can be held straight for the ~2 inches between the front of my serger and its needles. I quickly developed a technique of sewing slowly and aligning the two fabric pieces at the front of the serger.

It does look odd (and huge) as the pieces come together.

I still need to hem the bottom and attach some snaps, but I needed to check the size one last time. Anya is so thrilled with the dress, she wanted to keep wearing it.

And make sure it spun well.

And make sure it danced well.

She says it works 🙂

I need to fix the top-stitching along the neckline. The thread pulled funny in a few places, and I mis-judged the center V. Final step will be to hem the bottom – I’m thinking of a rolled hem to keep it light-weight and “spinny”.

Halloween 2017: Lion Mask – Completion

I cured Anya’s lion mask in the oven at 170 degrees F for several hours, and it got hard. Then we painted it. Anya wanted to be a rainbow lion. I had planned to blend a couple of pearlescent water colours — orange, yellow, brown, and cream — to make a tan-ish tone for the fur, then combine the red and cream to make a subtle pink for the ears.

When we were making the mask, I was worried the ears would be unstable. So I’d added a coating of papier-mâché on the back, extending down past where the ears mount to the main mask. This gave us solid ears that don’t seem like they’re going to snap off.

Anya painted the rest of the mask while I worked on the ears.

From the side — I’d left a void through which the strap could be run

We then used a glitter infused soft-gel watercolour paint to give the mask some sparkle – didn’t seem like a lot of glitter when the paint was wet, but the mask developed a nice sparkle as the paint dried. The tones are fairly subtle, and I took a wet brush to blend her sharp edges.