Skip to main content

Posts

Mixing layers and a 1 character error

 I recently spent a great deal of time resolving an issue that was make much more difficult because the software architecture had chosen to mix different layers of responsibility. The Error [ActionsApi] [Get] entity conformance check failed: document of type class org.apache.openwhisk.core.entity.WhiskTrigger did not match expected type class org.apache.openwhisk.core.entity.WhistActionMetaData. o.a.c.c.Controller$ Huh?  What? This error came from a Kubernetes installation of OpenWhisk . Due to a configuration error, this installation was not running serverless actions correctly.  Because this was in a new environment, it was not possible to simply revert the changes I had made back to the previous version - it would not run in that configuration either, so I had to put a lot of effort into determining what had gone wrong. The database Serverless functions are stored in a CouchDB instance.  Because this was a new install, one avenue to explore was the possibility tha...

Active vs. Passive Log4jShell remediation

 Log4jShell  All computer professionals should be aware of the Log4jShell ( CVE-2021-44228 ) and it follow on defects.  There is no shortage of opinions and lessons to be be learned: The difficulty of performing safe interpretation The problems when assumptions are not clearly documented.  I, for one, was completely shocked to find out that a logging system would actually attempt to do variable substitution in an actual message. The difficulty of finding and resolving issues with such a common library that is not provided by an OS package manager. IT'S A LOG4J CHRISTMAS One of my favorite podcasts, Security Now - episode 850 , discussed an analysis by Google regarding the depth of log4j dependencies.  From the show notes : One contributing reason is because Log4j is, more often than not, an indirect dependency. Java libraries are built by writing some code which uses functions from other Java libraries, which are built by writing some code which uses functions f...

Catherine Ann (Shinn) Liptak 12/29/1930-8/7/2021

Catherine Ann (Shinn) Liptak Catherine Ann (Shinn) Liptak, age 90, passed away with family at her side at the Sunnyside Nursing Home in Cloquet, MN on August 7, 2021. She was born December 29th, 1930, in Hart, MI to Eleanor (Osborn) and Hyman Hubert Shinn. She graduated as Valedictorian from Hart High School in 1948; graduating with Honors from the University of Michigan in 1952, with a BA in English and Speech, followed by a Master’s in Library Science. Catherine taught at a number of schools in Michigan and Minnesota until meeting her husband John in 1963, settling in a lake home that John built on Bass Lake after their marriage in Hart, MI on July 25, 1964. She worked at the Virginia Public Library until her retirement in 1993.    One of the constants in Catherine’s life was her love for her family. She was always quick to share stories about her parents and sisters, growing up on Griswold Street, working at the family drive-in restaurant, and having fun with her cousins. C...

FizzBuzz - part 4

 This is no longer really about FizzBuzz At this point, we are not talking about a simple number generator, and if we ask people to pretend it's a "typical" enterprise web application, we can continue to talk with an applicant about what they know. Nothing runs in a vacuum Even with properly running FizzBuzz code, you still need to deploy it.  A simple deployment would look something like this: It's not a good idea to directly expose your application server, so a more limited device like a firewall, load balancer and a reverse proxy server in some combination generally sits in front of an application. Almost all enterprise applications will also need to store the results of their processing somewhere - otherwise why did we build this? A cloud and an on premise deployment have the some functionality.  At the heart of it, they differ in Who runs the component (vendor, customer or shared) What it's called Run in the face of adversity  An applicant should also be able...

FizzBuzz - part 3

 Team Lead  In part 2, I looked at the additional items you would look for in a FizzBuzz discussion for a lead developer.  Without getting too much into what job title means what, the next level up is a team lead. The road not yet discussed My discussion here isn't meant to be exhaustive, there are additional areas an interview can and should go; however, this one is really the last one that I think could possibly have source code up on a white board.  After this, I really think you should start using boxes and arrows. RTFM - Read the F*#cking Manual won't cut it When I started my career, you really could get by with your K&R C manual and the various man pages.  That really ended in my SunOS world (we hadn't converted to Solaris yet) when we started developing in X-Windows R4/Motif.  You really could not actually do your work without an O'Reilly set of books or the equivalent. Today, being able to not only code using a library or framework, but also dir...

FizzBuzz - part 2

 Lead Developer FizzBuzz In part 1 we went over a simple implementation of FizzBuzz.  Now we are going to advance to what I expect a lead developer would create. Job titles are tricky things.  I am not equating this with a job title, what I mean by a lead developer is that they could help a more junior developer develop a more complete solution. Unit Tests The first change is the addition of unit tests.  Developers will develop structurally different code if they are required to develop unit tests.  In order to test code correctly, you have to be able to expose the different facets of your creation.  This allows unit tests to be short and robust. package dev.boundary.waters.FizzBuzz; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void test1() { FizzBuzz fb = new FizzBuzz(); assertEquals("1", fb.process(1), "failed for 1"); } @Test void test3() { FizzBuzz fb = new FizzBuzz();...

FizzBuzz - part 1

 What is FizzBuzz FizzBuzz is a simple programming exercise that is frequently used as a white board problem during interviews.  I, personally, have never used this problem or had anyone ask it of me during an interview so your mileage  may vary. I was inspired to write this sequence after getting Poly Bridge 2 as a Christmas gift.  As I was watching some of the truly intricate bridge designs on YouTube, I also ran across a FizzBuzz video (no, I have no idea why Google put them together as a recommendation).  What, I thought to myself, would happen if I took the simple FizzBuzz to the same levels as Tyler  and Arglin Kampling . I plan to discuss a progression of FizzBuzz from what I would expect from an entry level developer to an enterprise architect.  Since I'm playing both sides of this, I don't expect anyone else will make the same choices as I do - what's important is the journey. The initial solution : package dev.boundary.waters.FizzBuzz; import...

Are you technically ready for Cloud Native?

I'm going to focus on technical requirements in this blog.  That said, I do feel your organizational change is also a prerequisite  for you to be able to make such a transition effectively.  Cloud Native is About Culture, Not Containers  is a good starting place for looking at a transition from that point of view. A successful transition to a new deployment technology requires that everyone involved is ready for the changes necessary: The development team The quality assurance team The deployment team The platform team The operations team The facilities team The management team I'm not going to give advice on your organization's preparation, you know them better than I do and any advice would be speculative at best.  But there are a few structural boundaries that can be analyzed in order to determine if you have done the technical work.  I will be using kubernetes as an example deployment platform becau...

CodeReady Container address range

I've been working with Red Hat's CodeReady Containers and I recently had a networking issue that might not be obvious to all users. Hyper-V assigns your VM to an address space in the 172.x.x.x range.   CRC also assigns, by default, in the 172.30.0.0/16 address space. This all works well unless Windows assigns your VM an address in 172.30.x.x as well.  Then you get a bunch of networking issues where you can't connect outside the cluster.  This means you can't download images, etc. The solution - reboot your PC and restart CRC until you get an address outside the 172.30.x.x range.

CodeReady Containers inside vs. outside

CodeReady Containers Red Hat has produced a single-node kubernetes install that can run on a single developer's machine (also known by the acronym CRC).  This allows you to spin up a cluster, administrate it, and install your own software to it in an environment you completely control. To kick the tires, I wanted to do the following: Deploy a dead-simple application with one REST endpoint  Be able to access it from outside the cluster (i.e. figure out ingress using ISTIO, not just the OpenShift automatic route) Use an external build process using Maven and Google Jib (I like the buildpack like way that OpenShift provides, but I wanted to start without depending on all of that magic). Google Jib   In order to get jib to work, I needed two things: I had to go searching for how the registry that is bundled into CRC is exposed.  You can find the route in th...

All things come to an end - plan for it

In 2011 I built a PC with an i7 2600k that stood me in good stead until two weeks ago.  I had upgraded disks, memory and video cards over the years, but while upgrading my memory, I must have flexed the 9 year old mother board more than it wanted and I got an ugly sight: That is the CPU fail LED glowing to show me that the computer was dead :-( My how PC building has changed in 9 years!  Due to work commitments I couldn't take the time to build it's replacement, but the folks at MicroCenter hooked me up with a very nice AMD build.  I got it home, double checked that it would POST correctly and I was off to the races. First, I installed my drives from my old PC into the new box, turned it on and nothing.  I forgot to put the boot configuration into compatibility mode!  My old drives were created before UEFI, so I needed to turn that one.  One change and bingo! got the Windows boot screen.  A little nervious waiting while it said that it was configuring ...

Cardinality is critical

One important facet of software design is the cardinality between items in your system design.   As an example, consider a simple credit card based design from telecommunications: Given this design, you can explore many boundary conditions with your business partners. Can you have a customer without services? Can you have billing information without an account?  How about the other way? I'm diagramed this as having multiple BillingInfo entities.  Should they allow overlap?  How about one time payments?  Refunds and chargeback processing? Getting into the details of how the business works will provide you a lot of leading conversations as you develop your system, but I want to focus just the one relationship in dark black above, specifically the qualitative dimensions of the 0 or more accounts. If you think about a mass consumer product, you will have a fairly low cardinality of accounts.  A wireless customer may have a family plan with multiple phones,...