Friday, November 18, 2022

Daughter - killer of trees (and tires too)

 So my daughter was known as "killer of trees" when she ran into a recently planted peach tree with her dirtbike and knocked it flat over.  Now she is also "killer of tires" after a blowout on I4 between Lakeland and Plant city.  



We were blessed that it wasn't raining and we were not up north in the snow.  The worrisome aspect was that she was on I4 (which is notoriously busy) around 7pm (dark at that point) and in a section with concrete barriers and very little room.  We were very impressed she got the car over safely and didn't bump the barrier.  She was only a few inches from the barrier on the right side though.  Before my dad and I got there to help her - I asked her to get out the right-hand side and see if the tire could be patched, etc - it took her a few minutes to get out but she came back with a "I don't think so Dad.." which is pretty self-evident now. I had thrown in a small "pancake" air compressor which I had pre-filled just in case.  Didn't need to bother. 

She only had few feet on the drivers side front (which is where the tire blew).  My dad parked behind and hugged the side of the road a bit to "convince" drivers to stay to the left a bit.  That helped a bunch.  I had not had the spare tire and jack out of this car before - was wishing I had brought a speed jack.  I just slowly worked the jack up - taking a bit of a rest here and there for my knees and to enjoy the very cool breeze from the tractor trailers speeding by a few feet away.

As I was sitting there getting the car jacked up, I started to wonder how she got out of the car from the passenger side - it seemed like there was no room.  All I could visualize was her climbing out the window onto the concrete barrier (with a drop-off on the other side) - sort of "The Dukes of Hazzard" style. She told me later she had just enough room to squeeze the door open and get out - only because she was at slight angle was that possible.  

It is kind of funny the way some obvious things escape a person at certain moments. When I was getting the jack, etc out of the back of the car, I found a short bright rod/stake which I thought was in with the jack, etc.  It was just cheap plastic and my mind just jumped to guess it was one of the "emergency items" which you could use to either wave cars around you or put out behind a car to make it more "visible".  I wasn't impressed by the cheap plastic though.  The next day though - I went back out and found it again..  As I looked at it in the daylight I was thinking "something is odd"..


I rotated it a bit and when I saw our last name "Case" written on it, I suddenly knew what was odd.  It wasn't an emergency item - it was out of an old kids horse shoe game and this stake simply ended up in with the spare tire, etc.   I got to laughing with my mom and I told her about it and said I was glad I didn't have my daughter out behind the car waving it at traffic.  We got a big laugh out of that thought.



Trying to find replacement tires now - it is an odd size of course.  Seems like only one or maybe two (less common) brands even make tires in the required size.  I had planned on putting run flat tires on as replacements but there are none in that size.  It is hard enough to find someone with a set of those tires from the 2 tire types.  


1 Thessalonians 5:18
King James Version

18 
In every thing give thanks: for this is the will of God in Christ Jesus concerning you.


Sunday, November 13, 2022

Reasons for poor quality Software Systems

I've seen issues with software system quality over the years - it wasn't just one type of organization or domain. Why is this true even with continued innovation and best practices? I would expect to see improvements over time.  There are plenty of tools to help improve software quality.

Great IDE's

  • IntelliJ
  • Eclipse
  • Visual Studio

Language and compiler improvements

  • Java 11-19

Source scanning tools

  • PMD
  • SonarQube
  • FindBugs
  • CheckStyle
  • SpotBugs
  • VeraCode & Twistlock
    • more related to security but IMO there is a relationship between security and quality

Code generation tools

  • Lombok

Additionally, features like Java annotations are leveraged heavily nowadays which simplify configuration and lower overall code quantity/complexity.

I've found two common aspects across a number of organizations which I think are related to the quality issues.  The first aspect is lack of attention to the warnings listed in common IDE's.  I've seen some applications showing over a thousand warnings when I first worked with them.  This crosses implementation languages/run-times as well - Java, Python, JavaScript, NodeJS, etc. Of course, often IDE's only show the first 100 or so warnings so you don't even have a complete list typically.  

The second aspect is the use of technology, such as general annotations and also Lombok, without paying attention to all the details regarding how each related annotation works (for default and non-default settings).   Default behavior isn't always the required behavior. An example of this is:

create a class such as:

@Data

@AllArgsConstructor

@NoArgsConstructor

public class BaseData

{

/**

* Represent identity; lombok generated equals() should

* utilize this to determine result.

*/

@NonNull

private String baseDataId;

}

 

which is fine on its own.  Note that the name-prefix "Base" easily implies that you may create sub-classes though. Let's do that here;


@Data

@RequiredArgsConstructor

public class DerivedData extends BaseData

{

/**

* Represent identity; lombok generated equals() should

* utilize this to determine result.

*/

@NonNull

private String derivedDataId; 

}

No compile error is generated.  Will this work?  It depends - how are you expecting to use this class?  If you expect that the equals() method will account for both the baseDataId and derivedDataId then you will have an unhappy surprise. 

If you pay attention to warnings in your IDE though you will note a warning is generated. 

Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.

I've not seen PMD, Sonar, etc complain about this so those tools leave you feeling like "everything is awesome".  

Add some unit tests which exercise the equals() method in the situation where you are using the DerivedData class and have instances with matching derivedDataId values but different values for baseDataId.  You'll probably write the test indicating the instances should be non-equal.  Will you be surprised when the tests you setup indicating instances should be non-equal actually fail?

The reason it fails is that the generated equals() in the DerivedData class doesn't know anything about the members of the BaseData class.  So equals() in the derived class only uses the derivedDataId member. 

If you review the warnings in your IDE, you will find that it implies how to resolve this if it wasn't intentional - add annotation '@EqualsAndHashCode(callSuper=true)'.  But notice I said "it implies" because it directly tells you how to ignore the warning about this default behavior.  So a good question is - how often is the default behavior correct versus the logic always calling superclass equal() / hashCode()?  I suspect that the current default is opposite from what would be a safer default.

And this brings us back to IDE warnings being ignored.  If you ignore / hide those warnings you easily end up missing these types of errors which can show up as "anomalous production issues" at some point.

I think that an aspect of all this is the attempt to (over)simplify everything. So many details are abstracted away that developers won't see implications of all the "defaults" and "configuration by exception", etc that occurs is so many systems.

Thanks for reading..

Scott


Wednesday, November 9, 2022

Application Architecture and Design (and cloud aspects)

 Let's say you work for some organization and there is a need for a new application.  If you are responsible for the architecture / design then 

My initial post was going to end up being a "ancient" IT history book with some extra stuff. I decided that wasn't very helpful - not many people want to read a book in a "blog format".

I'm condensing the content down to the following. 

  • Use standard practices for
    • project management
    • design techniques
  • Understand the reasons/basis for soft/hard requirements - This covers why a requirement exist and why a specific requirement was chosen over other similar prospective requirements.
    • Examples reasons are;
      • development / operational / infrastructure costs
      • time to market /  speed of handling requirement changes
      • maintainability
      • performance / scalability / availability
  • Carefully evaluate technology choices.
    • Consider the risk of using any technology that could become unsupported before the end of the useful life of your application. New "amazing" technologies may only be around for a short period of time before something new replaces it.
  • Make plans to keep 3rd party frameworks, libraries and languages/run-times up-to-date with regard to the most current versions.
    • Consider the risk, for example, of using early versions of SpringBoot such as 2.1 which are not maintained now - if a new security flaw comes up, it may be very hard to fix the issue.

With regard to standard practices, use whatever is appropriate for your organization and the project need. Many organizations are trying follow "Agile" practices but that doesn't mean that "Waterfall" is always bad to use. Use what is appropriate for the situation.

Understanding the reasons used for requirement selection helps to keep requirements aligned with each other and provides useful context for handling business changes over time.

Technology comes and goes.  Don't love or hate particular technology - it is a tool.  Use appropriate technology and if needs change then consider more appropriate technology.  Don't select technology just because it is considered "great" by any person or group - consider the positive and negative aspects in-depth for your use-case.  

Small example of considerations - given a service expecting high transaction rates; what technology stacks might be considered and what are the trade-offs?

  1. Python
    1. Positives
      1. Increasingly used in enterprises
      2. OpenSource
    2. Negatives
      1. Library ecosystem isn't as mature as for Java
        1. You want a library to help with web requests?  Which option do you pick? What version of Python are you on?
          1. https://pypi.org/search/?q=web+requests&page=1
    3. Considerations
      1. Security
        1. https://www.theregister.com/2021/07/28/python_pypi_security/
        2. https://medium.com/ochrona/arbitrary-code-execution-during-python-package-installation-3a60990350ef
        3. https://snyk.io/blog/python-security-best-practices-cheat-sheet/
      2. Some libraries need local compilation
      3. Cross-version compatibility
      4. Transitive dependency handling
      5. Long term maintenance questions
        1. https://medium.com/codex/python-4-0-will-never-arrive-3d994dce54f1
      6. Runtime aspects
        1. Python global lock
          1. https://wiki.python.org/moin/GlobalInterpreterLock
        2. Memory management - also consider context including containers
          1. https://www.askpython.com/python/examples/memory-management-in-python
        3. Threading
          1. https://docs.python.org/3/library/threading.html
  2. Java
    1. Positives
      1. Heavily used in enterprises
      2. Generally has useful features and reasonably performance
      3. Many enterprise level libraries and frameworks
    2. Negatives
      1. New version every 6 months by Oracle can cause some thrashing of work
      2. OpenSource vs Oracle licensing
    3. Considerations
      1. Alternative JDK / JVM / run-times
        1. Oracle JRE
        2. OpenJDK
        3. Azul
        4. IBM OpenJ9
        5. Eclipse Temurin
        6. Amazon Corretto
      2. SpringBoot vs JEE
      3. Cross-version compatibility
      4. Transitive dependency handling
I highly recommend reading about and understanding the runtime aspects of Python. Consider the effects of memory pressure within and across container instances (i.e. Docker, Kubernetes, etc) - especially in a cloud environment and / or where you are cost / latency sensitive. 

Regarding compatibility and transitive dependency handling - I've had people with architect and team lead titles make comments to me along the lines of:
  • "Java versions are backward compatible so keeping up with current versions isn't important."
  • "We are pinning the SpringBoot version at version 2.3 instead of upgrading to 2.7+ because it improves stability by preventing changes."
I believe these statements reflect some general misunderstandings or lack of knowledge. There are very instances of 100% cross-version compatibility for operating systems or programming languages over significant spans of time. You also have to clarify whether you are talking about things like source code / binary compatibility and forward / backward version compatibility. Try running a bunch of games written for Windows 95 on Windows 11 - how many will work?  In my opinion - likely few.  For operating systems, computer languages and frameworks - features are added and deprecated / removed across releases.  API's change due to needs such as performance, security, new features, etc. If OpenSource is brought up as a solution to these type of issues - I'll claim it isn't reasonable.  There are support matrices for most major OSs, computer languages and library / frameworks - they don't maintain old versions forever. If you are outside a support matrix - you have no guarantee that anything will work and getting help will likely be somewhere between hard and impossible. Needing help for a major security issue or something that breaks a critical system is not the time you want to find out that no one can help you or can't help you quickly. Some common support / compatibility matrices below..

  • OpenJDK support matrix from RedHat
    • https://access.redhat.com/articles/1299013
  • SpringBoot support matrix
    • https://spring.io/projects/spring-boot#support
  • SpringBoot / SpringCloud compatibility matrix
    • https://spring.io/projects/spring-cloud#overview
  • Django support matrix / roadmap
    • https://www.djangoproject.com/download/
  • Nx / NodeJS / TypeScript compatibility matrix
    • https://nx.dev/packages/workspace/documents/nx-nodejs-typescript-version-matrix

Thanks,

Scott

Monday, October 31, 2022

Working and living around Tampa - the challenges

It has been over six years since we moved from up north down to the Tampa area.  We lived in an apartment for a while when we first moved down here - the biggest reason for that was the time it afforded us to research and find the best place to buy a home.  

I did a lot of research before picking the Tampa area as the place we should move to.  In many ways that research was correct.  There are many nice things to do around Tampa, there are many IT jobs, etc.  When we were choosing a house though, I wanted to keep options open a bit though.  I didn't know people who worked at any of the local IT employers so I wanted to be located somewhere central in case a future employment change was needed.  This was very sound reasoning and in the end was useful to a degree.

The first place I worked at down here was located in Temple Terrace.  From our house, it was typically a 35-50 minute drive which wasn't too bad.  There were occasional days where it was over 1.5 hours when accidents occurred at the wrong place/time.  Overall this was fine - until that employer announced pending layoffs and everyone had 3 basic choices - quit on your own terms, stay and see if you ended up laid off, select to take a termination package which required you to stay for some amount of time before you could get their "layoff benefits" package.  Since I had only been there for a couple years, the "layoff benefits" package wasn't very enticing. If you ended up having to stay until one of a set of predetermined dates - you end up looking for work with a flood of other people at the same time. In the end, it seemed like the best move was to quit on my own terms and find a new job before a large mass of other people were also looking for work.

I didn't have a lot of time to find something else but I did my best.  I found a place which was starting some similar cloud work and had some other interesting aspects.  When I interviewed there (about 10am), the drive was only about 1 hour which wasn't bad.  I was a bit nervous because the distance was quite a bit farther and required taking the interstate which had traffic issues on the news almost daily.  I decided to take this job and nearly immediately found that it was typically 75-90 minutes driving there and usually at least 90 minutes coming home.  My GPS would try to route me around traffic but that was usually pointless - I often ended up on streets with stop signs every few feet or the route was just erratic.   I continued with this for around 8 months and was very tired of the drive.  It was hard to be home at a reasonable time to have a family dinner together.  It would have been better if they allowed some remote work but that was never an option.

I was contacted by someone from another company at around the 7 month mark and we started talking.  They were looking for someone which had  had prior development lead experience and lots of general development experience, etc overall. I would have some architecture, dev lead, mentoring, etc work which was pretty much the description of a "dream job" for me.  The routes to this company followed the same initial path as my current company at that time but the new company was closer - not far from the airport. I figured this would reduce drive time by 15-30 minutes one way.  So given the "dream job" option and less driving - it seemed like a good choice to make.

So I made that change.  It was a little less driving but it was still daily stop and go traffic with motorcycles driving between lanes and other just bizarre behavior.  It was usually between 50 and 75 minutes to work and 60-75 minutes home. Nearing the 2 year mark here and then COVID hit.  We had just moved many people, including myself, into a new building next door - all setup with the open floor plan and everyone sits together at groups of long desks.  A bunch of different things just made it feel like it was time to leave there.  The original "dream job" description didn't include all the red tape that affected everyone living in my household due to the nature of the business.  At this point, I really am worn out from the daily drives and traffic, etc.  I realize at this point that it is hard to find something "close" to where I live which is under an hour drive. 

I reach out to agencies and look for remote work.  Jobs which require coming into the office on a limited basis would be great.  I do enjoy the direct contact with others.  I also decide to go with contract or contract to hire positions for the first time ever.  If something changes for the worst, it seemed like it would simplify changing jobs.  

I find a job with a large well known company and it is contract to hire.  It is fully remote at that point but it was indicated that it could change a little.  If I had to go into the office it would be 1.5 to 2.5 hours one way but if that was only once a month or so then that is doable.  There were no real decisions on the details or plans at that point.  I decided to give that a go.  It was going ok but I wasn't doing any real design/architecture work and was pretty bored.  Then one day, it was announced that there would be a 3 day in-office requirement starting in 2 weeks.  That was obviously not going to work well for me and the 2 week notice for it was beyond strange.  Fortunately, my local manager had already requested an exception for a month for that in-office requirement for me.  That ended up extended for another month since they really liked what I was doing.  I knew that at some point that would have to end - if for nothing else, it isn't fair to other employees who have to go in.  At some point, it would cause some friction with other employees if I was left exempted from that requirement.  

Anyways, I finally reached an end-date there and now it is time to find something again which I would love to be a long term employer which doesn't require large numbers of hours on the road each month.

So my recommendation to anyone thinking about moving to a new area like Tampa - think carefully about where the jobs are versus where you want to live.  Don't underestimate the effects of drive time and traffic.  Also remember to account for other things though like floods, hurricanes, sink holes , etc too though..  In the end, it may cause you to rethink how you define "best location" to live.


Wishing everyone in similar circumstances the best!

Scott

Tuesday, October 11, 2022

Hurricane Ian and my parents home

 My parents have been in a nice retirement community for a few years now and this isn't the first hurricane but it is the only one that did significant damage to their home.  Total loss..  

Both my parents and my family are blessed though - no one was hurt and God takes care of the needs. 

I'm very happy we have enough space for them to move in and store many of their belongings while they work through the insurance and wait for a new home.  It is estimated as a good number of months before it will be ready.  It is hard to say if there will be other delays - there are so many people needing replacements now.

It was much different seeing their pictures compared to us being their when I took these. These are after a couple weeks so the roads were clear of debris and the water had receded from the roads we use to get there.


These are from a golf cart on our way to their house in the community.



The devastation was hard to comprehend at this scale.  Tornadoes tear up homes but that is usually in a path you can follow and it may skip areas a bit.  This was just destruction everywhere.  Not every home was a total loss but many were and most others had damage to some extent. 




This is what we found when we got to my parents home.



These next 2 pictures are of what used to be part of the lanai. Roof and most walls gone.  A refrigerator was tossed out in the yard. 


Something like 2/3 of the roof was gone - it was now "brighter inside" but mosquitoes were starting to multiply and lack of electric or any chance of usable air conditioning makes cleanup even harder. I can't say that the smell of wet insulation improves with time. There was some humor though as a few containers in awkward places were full of water - my wife can attest to that!  I was fortunate to not drop the container of fishing weights and water - but I did tell my parents that it made up for them helping me move many heavy books between homes over the years! I probably am off a bit on that - I'm sure they still moved more books than I moved wet fishing stuff.



It is in God's hands and nothing else matters.

Romans 15:13

13 May the God of hope fill you with all joy and peace as you trust in him, so that you may overflow with hope by the power of the Holy Spirit.

  Jeremiah 10:12-13

12 But God made the earth by his power; he founded the world by his wisdom and stretched out the heavens by his understanding.
13 When he thunders, the waters in the heavens roar; he makes clouds rise from the ends of the earth. He sends lightning with the rain and brings out the wind from his storehouses.

Psalms 71:18

18 Even when I am old and gray, do not forsake me, my God, till I declare your power to the next generation, your mighty acts to all who are to come.


Wednesday, August 31, 2022

Tampa lightning storms and resulting chaos

 We had a very "impressive" storm the other day.  The lightning was incredible - never had that much up north and this was the first time in about 6 years since we've been in this area that it was actually a little frightening at times.

The wife and I were out to try and get some dinner and go by Lowes again (they might wonder if I sleep in the store somewhere at times).  We waited for some time before finally going into my Wifes favorite "fast food" place - still got wet but lightening had slowed at that point.

When we got home, our daughter said it had been really bad there as well - shook the house a couple times. 

We had noticed that the garage door opener didn't work when we got home but figured it was just the batteries in the remote.  It wasn't the batteries in the remote. The internet wasn't reachable either.

The electrical circuit that the garage door opener is on also has the Internet provider Fios equipment plugged into it.  One of those impressive lightning strikes ended up coming into the house through the electric panel. I do have a whole house surge suppressor installed but it isn't the closest set of breakers to the wires coming in from outside. This apparently enabled the surge to enter the circuit with the garage door opener and Fios equipment - that would be the shortest electrical path other than the whole house surge suppressor.  

There was an outlet extender on the outlet that the Fios was plugged into - that outlet was fried and the garage door opener was fried.

The surge then went from the Fios box over the coax that leads to our WiFi / router.  That was permanently stuck with a "red glowing eye" instead of the normal indicator light.  No hard reset, etc was changing that.  

At this point, I didn't really know whether the Fios equipment in the garage was fried.  I was assuming so but without a new WiFi / router that I could use I couldn't really tell.

I contacted the internet provider to try and confirm what was burned up and they couldn't see our WiFi / router and eventually assumed it was dead.  It wasn't clear to them whether the other equipment would function correctly yet.  They indicated that I should be able to hoop up any similar WiFi / router to get by with while waiting for a replacement - expected in a few days.This was a moment of "arghhh.." because I've been working from home and my job is pretty much only doable with an internet connection. 

I went out the next morning quick and picked up a low/mid-range similar router and got it home. Hooked up and then waited for the "green light"... which didn't happen.  I really thought the Fios equipment was toasted at this point.  I contacted the provider again to see if I could confirm that since I didn't want to be offline for even more days due to waiting on a service appointment.  This is where things seemed to get worse - the provider could not confirm that their equipment was blown and because I wasn't using their provider router they couldn't do anything to help diagnose further.  

My next day of work was interesting and I was tethered to my phone - using it for internet connectivity.  That was unexpectedly OK other than the point where my entire family received emails that my phone # has preparing to go over limits.  My kids found some glee in pointing that out over dinner.

Saturday morning, my wife and I ran over to the wireless store and I ended up upgrading my phone and upping my wireless plan a bit.  The funny thing at this point is that the wireless store didn't thing we should be getting any message regarding exceeding data limits based on our plan.  Anyways, not knowing how long things would be down I would rather be safe than sorry.

The new router showed up that weekend and it turned out that the Fios equipment was not burned out.  After quite a bit of thinking and researching, I think the problem I had with the 3rd party WiFi / router was simply that I didn't have ports forwarded, etc like the router from the provider has when you receive it.  I've not tested that theory yet but will attempt to set it up and get it working as a backup if I get zapped again.

I also invested in some additional surge suppression equipment.

  • Another UPS with coax support
  • An inline coax surge suppressor
  • Some inline Ethernet surge suppressors
Did I mention that after the surge took out our WiFi / router, it also took out 2 network switches - one at each end of the house.   Apparently, it followed the coax and continued on over the Ethernet cable.  Most of the family is using WiFi which may have saved some equipment.  I tend to prefer a wired connection for reliability and consistent speed so I guess some things were self-inflicted on my part.

Here is burned out garage door opener.  We had a new garage door installed just a few weeks before this - glad we didn't get a new garage door opener at the same time. I added a socket extender with some surge support after this was already burned out - just so I wouldn't forget it later.




Below, I am unboxing the new garage door opener once it arrived.  I ordered a couple extra remotes as well since it doesn't seem compatible with our old system.  This system is produced in Germany - just like our Bosch dishwasher.. hm, we waited nearly a year for that and got this in about a week - so glad we didn't end up in the same mess!!


Oh, did I mention that I was waiting to get this up and running before ordering a couple more wireless remotes and a keypad?  Guess what - the wireless remotes are now on back-order... from Germany..  Sigh..  

Here is the new garage door opener in use.  I like this one - it is very quiet.






Here is the network surge suppression equipment I picked up.



Below is the inline coax surge suppressor I wired up. It isn't wired very nicely yet but I didn't want to have it happen again before I had some protection in place.  I have the ground wire hooked to one of the screws for the electrical panel cover for now.





Here is the new UPS with coax support all hooked up.  Yes, it may be overkill having an inline coax suppressor and coax support in the UPS but as long as it doesn't degrade the connection speed, I'll hope it makes an additional positive difference.




I do want to note that there is a differences between "surge suppressor" and "lightning protection" but I'm not going to split hairs on the subject here.  In the end, I wanted a variety of protection which I hope will cover the most common situations that result in damage to electrical devices in the home.


Hope your day is blessed and free of lightning damage, etc.
Scott

Saturday, July 30, 2022

The Bosch 800 dishwasher - better late than never

 Our old dishwasher was failing so I took it out and ordered a new one from a particular appliance store chain.  We knew there was some delay early on when the store let us know they were back ordered  which wasn't apparent from their website.  That was ok - it seemed like it would be 4-6 weeks.  We waited and waited.. will little news from the store regarding when the new dishwasher. I called them and they said they still didn't know when exactly they would get it in but thought it might be in another month. 

In the mean time, I pretended to be a sort of Edward Scissor Hands and took my recipracating saw and cut about the old dishwasher so I could stick the pieces in the normal trash.  It was taking up too much space in the garage and I didn't want to try and get it the dump.  There wasn't much metal in the old one so not much incentive for the local scrap people that hunt the local neighborhoods.  Anyways got it cut apart and in a few weeks had it all gone.

Still waited for the new one and waited and waited. I finally did some research and found out that the Bosch dishwasher model we ordered is manufactured in Germany and shipped here.  And to top it off, there were notices on the internet that they were about 9 months to a year behind due to COVID.  

My wife finally convinced me to cancel that order.  I was left with a feeling that the dishwasher would probably arrive the day after that..  That didn't exactly happen.

As we left the original store, I decided to look online at Lowes for one again.  Originally their website said they were back ordered and could not be ordered online.  This time they showed they had 4 of them - just like we wanted! I couldn't believe it. 

I excitedly hauled us over to Lowes because I wanted an actual person to confirm it and I wanted to get an order in right then if they did exist.  The appliance lady told us if they got the order in and it didn't immediately get kicked out - then we would be confirmed for one.  The downside was that the units were not around Tampa but in a warehouse up near Washington DC.  Ugh.. Ok, but they had them and we got a confirmed order in!!   Talk about excited.  At this point it had been nearly a year!!  The temp dishwashers (aka, Wife, kids and self) were all tired and unreliable at keeping up the dishes - paper plates became a common Sams Club order.

So in a about a week and a day I got a call saying that we could set up delivery.  We aimed for that Friday and waited anxiously.  The delivery/installer guy got there and got it into the house and then noticed that we only had bare wires - not an outlet.  The store asked if we had electrical which we do - but apparently they mean "do you have an electric outlet?'.  So the installer said it couldn't do anything right then - we needed and outlet and then needed to reschedule the install.  He left the new dishwasher in the front room where I got to enjoy staring at it each time I left the house. 

I had a spare plastic electrical box, AFCI outlet and box cover.  I ended up installing that during the week and spraying the area under the cabine,t where the dishwasher would go, with white FlexSeal to provide a small barrier in case the dishwasher ever leaked.  It is a minor bit of insurance we hopefully will never need to worry about but just in case..

Finally, another week goes by and on a Friday I come out of the office for a minute and notice the dishwasher is installed!  Yeah!  They did it while my wife was off for during her final week of four 10h days before they went back to 8 hrs in the schools.

We got the black stainless steel version of the dishwasher and it is a bit more matte looking than our Frigidaire microwave and stove but it still looks very nice and is SOOOO quiet.


Below is FlexSeal I used to seal around the bottom of the area for the dishwasher.


Here is the new electric outlet I installed under the sink cabinet.
Here is the new dishwasher patiently waiting for installation.
And the final outcome!  Yeah!!


I'm glad it is finally here and done but do have to remember this bible verse below.

Hoping everyone's day is blessed!

Scott

Luke 12:15 ESV 

And he said to them, “Take care, and be on your guard against all covetousness, for one's life does not consist in the abundance of his possessions.”

Thursday, July 28, 2022

Performance and Scalability - draft doc

This is something I had started to work on quite a while back and just haven't found/taken the time to really complete it.  

Posting here now as a "draft" just to make it available.  Maybe sometime I can continue work on it once other obligations are completed.


Performance and Scalability



Tuesday, May 17, 2022

GPU, HPC, etc info and resources


Linux Graphics Stack

  • Nice overview
    • https://www.reddit.com/r/archlinux/comments/6la6n5/trying_to_understand_drm_dri_mesa_radeon_gallium/
  • X
    • https://wiki.archlinux.org/title/Xorg

Radeon / AMDGPU Driver

  • https://wiki.gentoo.org/wiki/Radeon
  • https://wiki.gentoo.org/wiki/AMDGPU
  • https://wiki.gentoo.org/wiki/AMDVLK
  • https://www.x.org/wiki/RadeonFeature/
  • https://dri.freedesktop.org/docs/drm/gpu/amdgpu.html#power-dpm-force-performance-level
  • https://www.x.org/wiki/RadeonFeature/#Decoder_ring_for_engineering_vs_marketing_names
  • https://kernel.org/doc/html/latest/gpu/amdgpu/display/display-manager.html

Ubuntu Certification for 20.04 LTS
  • https://ubuntu.com/certified/component/754

Intel Driver

  • https://linuxreviews.org/Intel_Iris
  • https://linuxreviews.org/Intel_graphics

NVidia GPU modules

  • https://github.com/NVIDIA/open-gpu-kernel-modules

GPU

  • https://wiki.gentoo.org/wiki/AMDGPU#Identifying_which_graphics_card_is_in_use
  • https://help.ubuntu.com/community/AMDGPU-Driver
  • lspci | grep -i VGA 
00:02.0 VGA compatible controller: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630] (rev 02)
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (rev 87)

A confusing aspect of this is that "Oland" is indicated as part of the Southern Islands family but some sites show other information which seems to conflict. This is especially true when you try to look up the individual models listed. The HD 8570 is indicated generally as a rebranded HD 7000 series. The "Southern Islands" family has a codename alias of "Sea Islands" [according to Wikipedia].   

  • Radeon HD 8570
    • https://www.techpowerup.com/gpu-specs/radeon-hd-8570-oem.c1974
      • Oland Sea Islands, Release 2013
    • https://en.wikipedia.org/wiki/Radeon_HD_8000_series
  • Radeon R7 240
    • https://www.techpowerup.com/gpu-specs/radeon-r7-240.c2463
      • Oland Volcanic Islands, Release 2013
    • https://en.wikipedia.org/wiki/Radeon_200_series
  • Radeon R7 340
    • Oland XT, Release 2015
    • https://en.wikipedia.org/wiki/Radeon_300_series
  • Radeon R5 430 OEM
    • https://www.techpowerup.com/gpu-specs/radeon-r5-430-oem.c2893
      • Oland Artic Islands, Release 2016
    • https://en.wikipedia.org/wiki/Radeon_400_series
  • Radeon 520 OEM
    • https://www.techpowerup.com/gpu-specs/radeon-520-oem.c4061
      • Oland Polaris, Release 2017

GPU docs

  • http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/10/SI_3D_registers.pdf
  • http://developer.amd.com/wordpress/media/2013/10/si_programming_guide_v2.pdf
  • http://developer.amd.com/wordpress/media/2013/07/AMD_Sea_Islands_Instruction_Set_Architecture.pdf
  • http://developer.amd.com/wordpress/media/2012/12/AMD_Southern_Islands_Instruction_Set_Architecture.pdf

GPU Firmware

  • https://wiki.gentoo.org/wiki/AMDGPU#Identifying_which_graphics_card_is_in_use
  • ls /lib/firmware/amdgpu/oland_{ce,mc,me,pfp,rlc,smc}
OLAND
radeon/{oland_{ce,mc,me,pfp,rlc,smc}

Debugging / Info

  • https://wiki.gentoo.org/wiki/Radeon
  • https://wiki.gentoo.org/wiki/AMDGPU#Identifying_which_graphics_card_is_in_use
  • DRI_PRIME=1   ; prefix for commands where gpu is secondary
  • amoeba
  • clinfo
  • dmidecode
  • drm_info
  • glmark2
  • glxdemo
  • glxinfo
  • glxgears
  • glxheads
  • GLZ
  • hardinfo
  • lsgpu
  • lshw
  • lsmod | grep -E  "amd|radeon|i915|vesa" 
  • lspci
  • rocminfo
  • sensors
  • vainfo
  • vdpauinfo
  • vkcube
  • vkvia
  • vulkaninfo
  • xrandr
  • xdriinfo

Intel i915 tweak

  • sudo sysctl dev.i915.perf_stream_paranoid=0

VDPAU - Video Decode and Presentation API for Unix

  • https://wiki.gentoo.org/wiki/VDPAU
  • grep -i vdpau /var/log/Xorg.0.log
[    94.821] (II) AMDGPU(0): [DRI2]   VDPAU driver: radeonsi
[    98.102] (II) modeset(G0): [DRI2]   VDPAU driver: va_gl

  • export VDPAU_DRIVER=radeonsi
  • DRI_PRIME=1   ; prefix for commands when gpu is secondary
  • vdpauinfo

VAAI - Video Acceleration API)

  • https://wiki.gentoo.org/wiki/VAAPI
  • DRI_PRIME=1   ; prefix for commands when gpu is secondary
  • LIBVA_DRIVER_NAME=
    • radeonsi ; For amd/ati
    • i965 ; For libva-intel-driver
    • iHD  ; For libva-intel-media-driver
  • vainfo
libva info: VA-API version 1.14.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_1_14
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.14 (libva 2.12.0)
vainfo: Driver version: Mesa Gallium driver 22.2.0-devel for OLAND (oland, LLVM 14.0.0, DRM 3.44, 5.17.6-051706-generic)
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Simple : VAEntrypointEncSlice
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointEncSlice
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSlice
VAProfileNone : VAEntrypointVideoProc

Vulcan

  • https://wiki.gentoo.org/wiki/Vulkan
  • https://vulkan.gpuinfo.org/
  • https://www.phoronix.com/scan.php?page=news_item&px=RADV-LBVH-Lands
  • vulkaninfo

OPENGL 

  • glxinfo | grep "OpenGL renderer" 
OpenGL renderer string: OLAND (oland, LLVM 14.0.0, DRM 3.44, 5.17.6-051706-generic)

OpenCL

  • https://wiki.gentoo.org/wiki/OpenCL#AMD
  • https://dri.freedesktop.org/wiki/GalliumCompute/
  • https://packages.gentoo.org/packages/dev-libs/intel-compute-runtime
  • https://packages.gentoo.org/packages/dev-util/intel-ocl-sdk
  • https://packages.gentoo.org/packages/dev-libs/ocl-icd
  • https://packages.gentoo.org/packages/dev-libs/rocr-runtime
  • https://packages.gentoo.org/packages/virtual/opencl
  • See ROCm below.
  • clinfo

ROCm OpenCL/HIP/MPI

  • https://en.wikipedia.org/wiki/ROCm
  • https://packages.gentoo.org/packages/dev-libs/rocm-opencl-runtime
  • https://github.com/RadeonOpenCompute/ROCm
  • https://packages.gentoo.org/packages/dev-libs/rocr-runtime
  • rocminfo
    • [update 2022/07/08] This finally doesn't segfault!!! To get to this point I ended up on Linux Kernel 5.18.10-051810-generic and Ubuntu 22.10 Kinetic Kudu along with lots of time messing with installs. Just use the amdgpu that comes with the kernel - don't try to get some external version. The DKMS pain was very high, time consuming and finally I gave up on that and found the bundled-with-kernel pieces worked fine.  I am able to use all 3 of my monitors with my desktop again.
ROCk module is loaded
=====================    
HSA System Attributes    
=====================    
Runtime Version:         1.1
System Timestamp Freq.:  1000.000000MHz
Sig. Max Wait Duration:  18446744073709551615 (0xFFFFFFFFFFFFFFFF) (timestamp count)
Machine Model:           LARGE                              
System Endianness:       LITTLE                             

SYCL

  • https://www.khronos.org/sycl/
  • https://www.khronos.org/sycl/resources
Checking for available devices:
sycl-ls

[opencl:cpu][opencl:0] Intel(R) OpenCL, Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz OpenCL 3.0 (Build 0) [2024.18.7.0.11_160000]

Running a slightly modified version of the Intel OneAPI "vector-add-buffers" C++/sycl sample produces:

Platform: Intel(R) FPGA Emulation Platform for OpenCL(TM)
  Device: Intel(R) FPGA Emulation Device
Platform: Intel(R) OpenCL
  Device: Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
Platform: SYCL host platform
  Device: SYCL host device
Cannot select a GPU
No device of requested type available. Please check https://software.intel.com/content/www/us/en/develop/articles/intel-oneapi-dpcpp-system-requirements.html -1 (CL_DEVICE_NOT_FOUND)
Using a CPU device
Running on device: Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
Vector size: 10000
[0]: 0 + 0 = 0
[1]: 1 + 1 = 2
[2]: 2 + 2 = 4
...
[9999]: 9999 + 9999 = 19998
Vector add successfully completed on device.

OpenMPI

  • https://www.open-mpi.org/
  • https://www.open-mpi.org/software/ompi/v4.1/
  • https://en.wikipedia.org/wiki/MPICH

./mpi_hello_world
Hello world from processor scott-z1, rank 0 out of 1 processors

OpenMP

  • https://www.openmp.org/wp-content/uploads/HybridPP_Slides.pdf
  • http://pawangh.blogspot.com/2014/05/mpi-vs-openmp.html

OMP_NUM_THREADS=3 ./hello

Hello World... from thread = 0
Hello World... from thread = 1
Hello World... from thread = 2

X-Windows

  • xdriinfo 
    • usages:
      • xdriinfo
      • xdriinfo options i915
      • xdriinfo options amdgpu
      • xdriinfo options radeon
  • xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x52 cap: 0x9, Source Output, Sink Offload crtcs: 2 outputs: 2 associated providers: 1 name:Unknown AMD Radeon GPU @ pci:0000:01:00.0
Provider 1: id: 0xa9 cap: 0x6, Sink Output, Source Offload crtcs: 3 outputs: 5 associated providers: 1 name:modesetting

Snapshot of GLZ info



Misc Links

  • https://www.anandtech.com/show/16775/amd-moves-gcn-1-2-3based-gpus-and-apus-to-legacy-also-drops-win7-support
  • https://gpuopen.com/learn/amdgcn-assembly/
  • https://kernel.org/doc/html/latest/gpu/amdgpu/display/display-manager.html
  • https://wiki.archlinux.org/title/Kernel_mode_setting
  • https://askubuntu.com/questions/1279420/amd-kernel-modesetting
  • https://ubuntu-mate.community/t/vgacon-disables-amdgpu-kernel-modesetting-amdgpu-init/23001/4
  • https://wiki.archlinux.org/title/AMDGPU
  • https://wiki.archlinux.org/title/ATI
  • https://wiki.debian.org/KernelModesetting
  • https://askubuntu.com/questions/1166054/disables-amd-gpu-kernel
  • https://unix.stackexchange.com/questions/730113/how-does-linux-set-older-gpus-to-use-modsetting-drivers-in-x-server
  • https://wiki.gentoo.org/wiki/AMDVLK
  • https://wiki.archlinux.org/title/Xorg
  • https://man.archlinux.org/man/extra/xorg-server/modesetting.4.en
  • https://dri.freedesktop.org/wiki/ConfigurationInfrastructure/
  • https://dri.freedesktop.org/wiki/DriConf/