Friday, May 13, 2022

Reading May 2022

 Better get these on the may list and finish up some things

Actually quite a bit of things "in motion" that get sidelined a little for work as I come and go.  Have a Practical Recommender Systems book I'm halfway into at the moment as well.  I'll be finishing up some things this month that I've been cycling back to.

Monday, April 25, 2022

Things I Haven't Written About

  • Scalzi's Kaiju and how woke that bastard is....
  • More Undaunted
  • Under Falling Skies
  • Python and what I'm doing to keep myself current including
    • Geofenced Pinot with Streamlit
    • Streamlit in general
    • My general how to keep myself competitive targets
  • More about Covid
  • April's reading
  • The Year in Tech 2022
  • Rachel's Widowhood
  • What I'm Not Getting Done Around the House
  • My desire for a new bicycle and treadmill after my endless effort screwing around with carbon brushes on the old one
  • Banjo 
  • Where's my book at?
  • Dan's stone
  • Getting off social media because billionaires suck
  • All those other things....including Alex leaving.

Saturday, April 23, 2022


I woke up Thursday morning at 2:00 a.m. with the chills.  Having had a dry cough that seemed a little suspicious even for what I've experienced on blood pressure meds, I took one of my free tests.  The test was pretty insistent after I'd peed on it that I was pregnant with covid.  I'm pretty sure I know where I got it as my events were fairly isolated in time, so I'm going to blame Jesus.  I wouldn't have changed my behavior, but the irony of probably getting it from an Easter breakfast buffet when I don't do Easter meals and really generally dislike buffets - Mama Sheila's excluded, props to her for serving the buffet food and keeping multiple sets of fingers away from everything - is ironic.  Perhaps Jesus felt a need to give it to me to prove he can save me.  That whole I only hurt you because I love you and want to teach you a lesson thing.  But mostly I think smart people who designed vaccinations saved me.

My experience with covid so far leads me to believe there's an intelligence to the disease. Dry cough, try to trick you into thinking it's just the dry cough that comes with blood pressure meds...annoying sure, but it doesn't seem to be getting to you. How about a headache and heavy runny nose/congestion? You're going to sleep upright and take meds? about these intermittent but hard core chills during the night...those your kryptonite? You're sleeping in your flannel robe under the covers to try and mitigate it and just logging extra hours in bed to make up for the sleep disruption? Well la te about some muscle cramps? Let's target the muscles that are usually a little achier as you've aged that twinge a bit after exercise and try and ramp up those specific aches until they're hard to ignore. No, still not getting to you, I'm nothing compared to achy muscles end of the day after an Almanzo bike ride? How about some abdominal cramps? Almanzo or RAGBRAI give you abdominal cramps? Reminds me of Lyme's [which I had twice] in that it seems to be wandering around the body looking for a weakness. I'd hate to experience this w/o being vaxxed. My condolences to anyone who's gone through or lost someone they care about to it so far. Be careful in MN - the rates are waaay up and those multiple BA2 variants are super infectious.

Thursday, April 21, 2022

Raccoon Sky Pirates Adventure

 Raccoon Sky Pirates Adventure


An intrepid band of raccoons, all with different motivations, yet a common goal, gathered together at their home, the city dump, to discuss how to achieve their aims beyond the confines of their home.

The Heist of Raccoons included:

Brisket Jack [Scott] who referred to himself intermittently in the third person.  Gray and grizzled his mask was slowly blending into his other fur.  Brisket had only four fingers on one hand, having lost one fighting a pit bull [allegedly] who had cornered some foraging kits.  Per Brisket, “Brisket chased that junk yard dog completely out of the junk yard.  Now he’s just a dog.”  Brisket seeks glory and adventure, an example for other raccoons to follow.

Vibrissa the inventor [Aeryn, they/them], who had only two legs, their back legs replaced with uneven wheels, one rubbered, one only a rim, from a lawnmower and kid’s tricycle, and a small cart, the result of a wheeled invention not going right when coupled with a jet pack and molotov cocktails.  Vibrissa once aided Kit in overcoming dump night terrors where Kit would awake to be terrified of the looming shadow of the mounds of the dump, by variously blowing up mounds in the dump.

Kit [Hank, they/them], the littlest raccoon, although more appropriately the shortest raccoon, almost a ball in stature.  “I’m shortest on two legs, but not the littlest.”  Kit as a growing raccoon, is excited to find and wash some new food, even to the point of eating it right on the spot.  Kit is more relaxed around Vibrissa as they have learned to associate inventive explosions with food.

Rabies Eddie [Kyle, me/mine] the untamable beast.  Eddie is grizzled and has seen to much and been in too many places, and often lives inside mes own head, staring off into the distance.  Maria Triple XL takes care of him but has to be careful, as there was an incident where Maria got between Eddie and some possums and bit Maria.  As Eddie says, “Things got kind of hairy.”  There’s a bit of ill will between them over the bites, despite the protective nature of their relationship.

Maria Triple XL [Chris, Bad Ass Motherfucker], the colossus, strong, deft, and brave.  And a bit stout and square.  A protective relationship with Rabies Eddie that resulting in the “biting incident”, many of which are still healing, although no rabies resulted.  Maria loves food.  Loves to swim and has a secret the BAM shares with Brisket about a lost treasure outside the dump as they were litter mates.

The Heist begins to design a ship that can carry them all to adventure and treasure.  Several ideas are bandied about including using Legos [how many, each raccoon’s weight in legos?], a bathtub, a cracked hot tub, trash cans, dirty dump water, helium, and milk crates  Initial experiments involve trying to loft Kit skyward using a milk crate, a rope, a bag, and helium. The helium works much better than expected nearly dragging the whole party off the ground.  Vibrissa eventually reads the canisters and realizes they’re not full of helium, but are full of Fizzy Lifting Gas.  Several panels of scrap wood, half a dozen beat up trash cans, two rear propellers, two side propellers, an engine/motor, and a couple of super soakers are all lashed together under a large balloon, with a beach ball used to control the amount of gas.

Brisket Jack’s artistic drawing of the TinCANic [figure 1] , the sturdiest of Raccoon Flying vessels ever constructed, naming heavily indebted to Torch Key the Raccoon who was absent this adventure.  Maria Triple XL dumps the dump water Brisket collected for the BAM, declaring at the end of the adventure, a giant expanse of warm clean water awaits. Vibrissa adds some railings for safety purposes.  

With the release of fizzy lifting glass, the Heist is away, floating roughly above fence height, then higher until they can survey what lies before them.  Maria can smell a mix of chocolate and the same scent in fizzy lifting gas to the northeast where trucks carry something from the chemical plant to a factory.

The initial journey is particularly smooth as a lightly moonlit night begins to fall and Maria guides the TinCANic onto the factory roof, landing deftly on an A/C unit to protect the props while repairing a malfunctioning rotor, following the mantra gained through a lifetime of experience, “If it doesn’t fit, force it.”  It is noted by Eddie that Maria is deft at releasing gas.

The factory reeks of chocolate and the Heist heads down the side of the building and enters a hallway via the loading docks.  Maria XL almost gets stuck between a truck and the door, but Kit assists and the Heist is in, examining a hallway full of doors.  The first room seems to be nothing more than random supplies: 150’ of bungee cord, a fire extinguisher, a ten gallon bucket of soap, some lawn chairs, and more.  A second room is nothing but Halloween decorations and hard candy.  Maria XL feels a BAM can blend in more appropriately with glasses and a fake mustache from the Halloween supplies.

Photo courtesy of Vibrissa:

Following the signs, the Heist gets to the chocolate floor entrance and forms a raccoon pyramid, with Kit on top pushing up the door handle with a broom from the supply room.  Inside the room is glorious with the smell of chocolate and a giant bucket that seems to be full of 1000 gallons of liquid deliciousness.  Both Maria Triple XL and Kit head to the top of the bucket, climbing scaffolding and walkways.  Brisket heads up after them with a bit of a completely unnecessary acrobatic flourish.

The level of the chocolate is a bit too far for a raccoon to reach and Kit suggests a raccoon chain.  Maria agrees and dunks Kit, but proceeds to fall in, both of them floating in the giant bucket of chocolate.  Kit calls for help, but Maria is content to float and bask in chocolate.  Brisket heads to find the broom and 150’ bungee cord to pull them out.

All of the ruckus attracts the attention of a human factory worker and a dog in a little office overlooking the floor.  The dog comes bounding down to attack and Brisket gets in its face, asking, “Do you remember me?” while waving four fingers at it.  The dog recognizes Brisket and whimpers and barks, but backs off.  Meanwhile the human is pulling an alarm, screaming “There are raccoons in the chocolate” and coming down the stairs to intercede.  Rabies Eddie starts chasing the human up the stairs and the human hides in his office, obviously concerned about Eddie’s potential for actual rabies.

Meanwhile, Vibrissa whacks a big red hanging button with the broom, triggering a chocolate dump and gently spilling 1000 gallons of chocolate, and chocolate covered Kit and Maria XL onto the factory floor.

A not quite exact reenactment of 1000 gallons of chocolate spilling on the factory floor.  Note that the factory was a bit more gentle in its dump.

Maria heads up the stairs to fetch Eddie, who’s in his zone, while small orange humanoids coming rushing into the factory floor from the other direction, slipping in all the spilled chocolate.  The party decides it’s time to make a hasty retreat and heads back down the hallway to the docks, leaving behind chocolate footprints and long chocolate smears, like someone dragged a dirty diaper down the hall.

In the docks, most of the humans are lining up and heading out the doors while the alarm sounds and Vibrissa takes a moment to chew through a break line in case anyone tries to follow.

The Heist rushes back to the roof and the TinCANic, but several humans see them, and a man in a large tophat and suit rushes out to shake his fist at them before disappearing back inside.  The Heist feels safer aloft, but realizes the man in the top hat is chasing them in a semi.  Hopefully the semi with the bad brakes.  But then they realize the brakes do not matter as the little orange workers scurry around the truck into the back and the whole thing begins to lift of the ground heading toward them in a straight line.  The truck is attacked with the super soakers, but the attempt is foiled by the simple invention of windshield wipers.

The stress of the escape is having an impact on the TinCANic, and in the chaos, Brisket messes up the steering, interfering with the ability to simply turn and get away from the man and the floating semi.  But with some inventive spiraling, the Heist manages to angle themselves away at a ninety degree angle while the truck goes floating in a straight line, the factory owner shaking his fist at them, and the rear of the truck full of a few little orange men and a bladder that is probably full of fizzy lifting gas.

With the broken helm, the Heist continues on, attempting to get to the “thousand raccoon tall” buildings nearby as light slowly starts to appear on the horizon and humans begin to mill about.  But before the sun can rise, a small blinking light appears in the distance, seemingly drawn by temporary noise from the motor that Kit manages to quiet, but not soon enough.  As the TinCANic moves up and down to evade it, it matches their fences height precisely.

[General flying pattern of the TinCANic post helm issues]

As it gets closer, it becomes obvious the light, which starts to flash red and blue, is a police drone. Brisket yells to get to the super soakers, and a well aimed squirt causes the drone to start to spark and wobble toward the ground.  But alas, more police drones are on the way and the Heist feels it’s time to head to ground, in more ways than one.

Maria tries to take the TinCANic in for her signature landing, but slams it into the ground hard, breaking apart moldy wood, and throwing rivets and connecting bits left and right [and up and down].  Vibrissa cuts the engine and despite the desire to investigate the tall buildings, the Heist heads for possum woods, home of Squinty Pete the possum, to lay low for the day while the humans are at their busiest and the drones continue their search.

So while the houses were never reached and Maria failed to find a giant pool or tub full of warm, soothing water, a giant pool of chocolate was a delicious, temporary substitute, Brisket Jack got to relive his days a a tamer of junk yard dogs, Vibrissa was able to test many new inventions or at least reuse of existing inventions and learned where to find lots of dizzying lifting gas, Rabies Eddie got to take on overwhelming odds against both a dog and human, a reason to go beserk on someone other than Maria XL, and Kit, though not able to find some new food to wash and eat on the spot, did allow the Heist to explore areas of the chocolate factory and was washed in edible chocolate.

Saturday, April 09, 2022

Undaunted: Normandy - Scenario 2: Montmartin-en-graignes

 I started solo playing Undaunted: Normandy again the last few days. I started it back in 2020 playing with my wife and once with Klund but, well, most of the world is aware of what sort of derailed people at that point.

I've been playing a few rounds of each scenario as I go.  I'm not very far along, but I've rediscovered my enjoyment of the game.

Scenario 1: La Raye I played three times.  The first two, the Germans beat the US so fast and so suddenly I thought there was something wrong with half my brain.  I pondered whether I'd inadvertently cheated playing solo, knowing what each side was sort of up to.  After all, I'm not using some set of mechanics to mimic an AI on the other side.  My simple rule is "the half of my brain that currently has initiative is the first to look at their cards and decide what to play for initiative."  It's not perfect - the second me can't completely forget what the first me did, but I generally have a plan before I look at the cards for each side, so I try not to cheat and I think I'm pretty successful.

So on the third play, the US tied up the center which is where the Germans were waltzing in the first two games.  Completely different experience.  Went for MUCH longer and the US had to really grind the left side of the board where the other victory points were to grab a win, and it came down to pinning [no more riflemen for one side] the Germans.

I've only played Scenario 2: Montmartin-en-graignes [looks beautiful on Flickr] once so far and the US won.  Photo below.  They split and went down both sides, staying heavy on scouts in the deck initially and keeping the deck small so the squad leaders could inspire to keep everyone in good cover.  By the time they got to the south end of the board, some bad rolls by the German machine gunners opened an opportunity to jump on the nest and pummel it into submission.  It's surprising how unlikely you are to roll an 8 or better with four d10 dice sometimes.  For the German part, they focused on the MG cards to keep suppression up, but might have been better with a bit more diversity for when things got close.

I did like that we GROUND through the fog of war cards.  I had a few turns where the US almost stopped for a moment just to grind them away when killing one surfaced another.  Made for a much more active deck and it might be what really won them the scenario. 

End of game - machine gunners popped off the board just for fun as the riflemen on the right already grabbed the one point they needed.  The push south started on the left and you can see the Germans went there, but then had to try and chase back to cover both sides with only one squad.

Friday, April 01, 2022

Reading April 2022

Saturday, March 05, 2022

Reading March 2022


Lots of training this month - ML/AI, Neo4j, Streamlit+Pinot, Snowflake, AWS Neptune, Graph DB general algo.  Trying to bridge a knowledge gap at work.

Sunday, February 06, 2022

Reading February 2022

Sunday, January 09, 2022

Reading January 2022

Sunday, November 28, 2021

Reading December 2021


Monday, November 08, 2021

A Writeup on GraphQL and FHIR

GraphQL and FHIR 

I know, some of these links won't work. Internal hub and all...but assume they were informative.

During I+P I spent some of my time looking at a FHIR to GraphQL plugin from The Guild (Envelop) to generically map various known schemas, including  FHIR, to unopinionated GraphQL. e.g. a generic enough GraphQL schema that it can be done automatically instead of carefully traversing the source and  target and agreeing on a mapping. Downside of being unopinionated: your GraphQL schema can be a little hard to navigate because it's not in the client's  product/domain language and you're generally serving up your structure client side. Upside: with little effort you can stitch together / federate JSON,  REST, FHIR, mySQL, oDate, gRPC, and more. Downside...if you're generalizing your GraphQL instead of carefully targeting the client's language /expectations/ease of use and instead of carefully mapping for where you get duplicate calls, you can lose a lot of the power / advantage that comes with  GraphQL. 

I have some familiarity with FHIR (Fast Healthcare Interoperability Resources) and Rasanjalee Dissanayaka M. Dissanayaka Mudiyanselage does an  amazing, in-depth walkthrough here that puts my little bit of configuration programming to shame: Introduction to FHIR (Fast Healthcare Interoperability  Resource). But I started at square one by reviewing the internally recommended Udemy (free) course, Introduction to FHIR. One hour long and I'd like to  recommend you save yourself the hour and never watch it unless it's a requirement for your annual review I'll summarize it for you here: 

Introduction to FHIR (1 hr) – Udemy - by Vivian Sendling-Ortiz 

Advice: I started by watching the opening parts on 1.25x (intro, JRE, Mirth install)…in retrospect, watch the whole thing on 1.25x or faster and be  prepared to skip ahead. The presentation is primarily config and transform and a lot of waiting on installs/minor changes. Of interest, what is FHIR: 

Fast Healthcare Interoperability Resources – an upgrade to HL7 

HL7 2.x was basically unreadable – pipe separated sections 

HL7 3.x was XML and a dismal failure 

FHIR supports XML and JSON 

All these versions and other specifications are out there and the mapping between them is generally already known. 

What was important? Mirth (NextGen Connect) exists. It is a cross platform middleware interface engine for exchanging messages. A glorified transformation engine that understands the transforms between standards. Very anticlimactic.…I felt like I was back in my  BizTalk days. However, Rasanjalee Dissanayaka M. Dissanayaka Mudiyanselage and I had a good discussion about Mirth because  she did some of her own transform work for a POC (see the post above). So as a talking point, something to know, it's useful and  moves you past simple - but potentially frequent - mapping to a dynamic process that gets a lot of table stakes transformation out of the  way and gives you a place to codify one-off rules. 

It's more fun to just play around with the installed Swagger - the OpenAPi/Swagger for experimenting with POST/GET against the API. - the base URL for HAPI FHIR. If you want to play the API, there's given and family and then there's name  that does a match against both (Scott for instance) and returns a nice list that you can then use to examine the JSON and start  to traverse the schema. 

Here are some pictures of all that in action...but not the Mirth/NextGen Connect transformer. I recommend going over to Rasanjalee's post (Introd uction to FHIR (Fast Healthcare Interoperability Resource)) as she walks through all of this including inserts, updates, persistence layer, data  structures, and more. What I call out below is a little- to no-code variation. 

Grabbing a patient via gender...note this isn't part of the add-in, exactly (it is), we'll get to that... 

A list that comes back from patient if I search on name = Scott (looking for matches in first || last)...

The response...

So WHAT does interrogating the FHIR online OpenAPI have to do with my dig into FHIR/GraphQL? Well, the add-in (you can grab the code here: https://gi is smart enough to allow you to simply point at that exact endpoint to consume the REST as a GraphQL structure. In a  perfect world, you'd have your own FHIR server, but for demonstration purposes, pointing at a working demo on the web is at least a few magnitudes  easier. Here's some of my YML pointed directly at that this case, the source is FHIR, but per above, there are add ins for other data  sources as well and if you install them and map them in this yml, you can federate your GraphQL calls. I'll leave the concerns about performance for you  to mull around in your head if you're doing multiple calls for a tree structure that reach to multiple locations for individual properties within a nested list.

We'll get to the good part in a moment, but another important bit are the scripts to grab the schema and create/map/generate the unopinionated GraphQL  schema from the latest FHIR version. Bonus....the addin serves up a local version of GraphiQL UI on localhost for you to play around with...don't worry  about that error message in the terminal It's not important unless you think it is and the FHIR server is having simultaneous issues and you assume  causation when it's just correlation. If you have the luxury, sometimes waiting is the best debugging.

Head over to your browser. Change Jane to Scott (in my case), click/unclick any properties or sub-objects you want to add which automatically inserts  them into the GraphQL JSON query (all conveniently saved as flat files with a graphql extension in example-queries), click the run button, and select the  option you want (PatientSearch in this case) and voila...back come Scott records and all their data via GraphQL:

I know what you're thinking...Scott, you didn't code bupkis. Nothing. You installed Node, cloned Mesh from Github, ran the install for the connector, and  ran the scripts that were laid out for you. Yep. And if you're lazier than I am you can even target the sandbox with files... /Urigo/graphql-mesh/tree/master/examples/openapi-stackexchange?file=/package.json or the sandbox without files... 

So...what did I learn from my configuration adventure and why did I do it?  

Uri told me to in "Let’s Build! FHIR + GraphQL Mesh – Connect All Your Existing Sources into One Data Graph with FHIR and GraphQL Mesh"  (57:16) and I really wanted to see it for myself. It felt like he skipped some steps/parts because it was so easy and I wanted to know if that was  realistic or if it was more complicated than he was letting on: - v=bnLB98xQc9o 

The ability to federate multiple data sources with little to no effort (until you run into performance concerns) and map them all to a unified only what's-asked-for response is incredibly powerful. 

It moves the exploration of the FHIR specification client side and modifications to that specification (via OpenAPI, limited / sub-version / hosting  as a RDBMS structure) can be accommodated by regenerating the GraphQL schema (although keeping in mind rules around deprecating fields). I can interrogate the FHIR schema like it's JSON and see real results without many individual GETs. 

GraphQL provides numerous advantages over the REST implementation with complicated/nested schemas: 

Avoids overfetching (only the data asked for) 

Full intent in one query/one result 

Spec is typed 

Can “explore” client side using GraphiQL (or other tools) and you don’t have to be a developer to explore the data/queries. There are Server/Client versions…you can incrementally expand/build out the schema as you expand/build your data source or  handlers, and the schema isn't hidden in the code. 

GraphQL Mesh builds on GraphQL advantages: 

Uses existing services/standards/sources (SQL, GRPC, MQ, SOAP, OpenAPI/Swagger, oData, MSGraph, GraphQL….). And now, a  FHIR handler (SOAP handler + JSON schema handler + some extra bits). They're looking for a good option / use case for a MS SQL  handler. 

Uses the original GraphQL protocol but with a better dev experience (e.g. the whole "non-opinionated" aspect versus learning a new  data structure) 

Run/execute anywhere 

Federated: connections between different graphs (an example is an event, like a dev conference, with a city/location, and there’s a  separate city service with weather…all events can be returned in a response that includes weather as a property or subobject for each  event). 

Already handles mutations and will be getting more support. FHIR is a big focus because Uri himself was consulting with companies  going after easy FHIR implementations.