Eureka!

Nov. 6th, 2024 11:55 pm
billroper: (Default)
I was talking with one of my co-workers today about how to fix some particularly intractable problems with the build, when I suddenly had the "Eureka!" moment and realized how to simplify things. Better yet, not just how to simplify things for me and my group, but for all the people in my related group of co-workers on the other side of the wall.

It's nice when something like that happens.

And so far, it's testing out ok.
billroper: (Default)
Today was spent trying to sort out various merge artifacts. I think they're cleared up now and we should be able to make progress.

That's the objective, right? :)
billroper: (Default)
Work is going well lately, although a bit disjointed as I jump between projects. But I think I managed to fix a long-standing problem with some of our cookie handling yesterday (with a lot of help from another of our folks who set up the environment and ran the actual tests). We're still testing to make sure there are no cases that defeat the new code, but it's working in all the cases we've managed to recreate so far. This makes me happy.

Home has been disjointed too, but I managed to sneak down into the basement and complete the final fades on a number of tracks. I still need to go spend some time playing with SpectraLayers, but it's been busy and is going to continue being busy for a bit.

Meanwhile, the Mets beat the Brewers tonight to win that Wild Card series, so three out of the four favorites ended up losing. This gives whole new meanings to the word "favorites". (Yes, I know the favorites lose, but they sure seem to be losing a lot in this small sample size of the last two years.)
billroper: (Default)
Thanks to everyone who stopped by Bandcamp today. I appreciate it!

Meanwhile, back at work, my co-worker and I sat down and coded up some changes that should make the project that we're working on better. Unfortunately, by the time it was built, there was no time to fire up the test environment and see how it works.

Monday! Monday will be a good day for this.

Anticipation...
billroper: (Default)
After my mournful look at the Cardinals' season a few days ago, they have proceeded to grab two wins against the Brewers in 24 hours. This doesn't improve their position a whole lot, but it beats the alternatives.

I have a couple of things going here at home that involve filing forms. One worked, the other didn't. Now I need to figure out what it was I did wrong on the bad filing and whether or not it just cost me a noticeable chunk of money.

I have some code at work that looks like it's working, but the wrong thing is happening. So I need to find out why that's going awry. That will be tomorrow's problem at work.

Returning to the good news front, I did a load of laundry this afternoon and the dryer appeared to work correctly. This makes me happy. I am hoping to remain happy with the dryer, but at least I got to test it before the weekend.

And the trash has gone out, which is always a good thing. :)
billroper: (Default)
I have fixed a bunch of little things at work. Now, we just need to build them.

But this is not my problem, at least for a couple of days. :)
billroper: (Default)
One of my co-workers had been working on a project to fix a particular bug, but hadn't made a lot of progress on it. I suggested that I should take it over and do it while he worked on something else, since I have more experience in that neighborhood than he does. He readily agreed.

I showed him some of my interim code and he allowed as to how it was similar to the approach he had taken, but that my code was a little cleaner, because I was more willing to change some things that needed to be changed as part of the fix to knock out things that were going to be weird.

After several hours of effort yesterday and today, I suddenly realized that there was a much simpler way to fix this than the horribly invasive approach I was taking. I went into the base class for the offending group of objects, added a boolean to control an option along with an alternate constructor, and then changed one line of code in that class. And then I went to one of the derived classes and used the alternate constructor to enable the option for that class.

Everything appears to work. And I revised the unit test in the neighborhood and it agrees with me.

I'll do some more testing just to be sure, but I think this particular problem is fixed. :)

It's amazing how easy some things can be once you think about them in the right way.

Behaviors

Jul. 29th, 2024 09:40 pm
billroper: (Default)
One of the things I've learned about complex software is that the best way to describe what it does is that it has behaviors. The behaviors of the software are controlled by the rules that are programmed into it.

If you write the rules correctly and the interactions are nice and tight, then your software will be well-behaved. If you write the rules badly -- or, God forbid, fail to initialize parameters for the rules through one or more species of programming errors! -- then the software will be badly behaved and unpredictable.

All of this turns out to be harder to get people to do than you'd think. :)

Traction

Jun. 11th, 2024 10:08 pm
billroper: (Default)
I suddenly got traction on the work project this afternoon and wrote a whole bunch of code that worked.

I still need to write a lot *more* code that works, but the ball is now rolling downhill, which feels good.
billroper: (Default)
It's been that sort of day.

I spent much of the day at work trying to untangle some of my code that interacts with the Java UI. I have never worked with any of the Java UI code before last week and it is behaving in some extremely mysterious (and sometimes just outright weird) ways. I suspect I will end up sending an email later this weekend begging for an explanation of the weirdness, because I need to sort out the problem and move on. We'll see how that goes.

Meanwhile, I picked up my guitar during a compile and decided to play "The Boxer". My recollection is that playing it in the natural key of G has been causing me to bottom out on the low notes, so I dropped a capo on the neck to move the song up a full step to the key of A.

And then I proceeded to sing the whole song an octave up. Happily, it turned out that I *could* sing the song an octave up, but if I was going to do that, then why did I need the capo?

Brain damage. Clearly brain damage.
billroper: (Default)
I spent a couple of days this week popping a new feature into some of our code at work. Today, I was finally in a position to test it.

Naturally, it failed.

But then I went and fixed the null pointer exception that had resulted from trying to retrieve a value from one model using a key that belonged to a different model and now everything appears to be working correctly. At least, the cases that I've run are doing the right thing.

So now I've found the bug that was lurking in the new code and can safely check it in.

Or maybe I'll do some more testing first... :)
billroper: (Default)
I merged a bunch of changes from a patch that I'm working on over to the branch for the new feature that will supersede the patch. It looks like that all worked correctly and I've gone through and fixed a few bugs that were lurking on the new feature branch, so tomorrow I should be able to make some progress.

"Forward momentum!" That's the trick...
billroper: (Default)
This turned out to be really simple, but it was really difficult to find this as I was digging through the information on Jackson serialization, so I'm going to mention it here in case it's of use to anyone else.

I have some Java classes that are IDs that we cache so that (if everything goes right) everyone shares one copy of the immutable ID. They can all be represented as a Java String and there is a static valueOf() method in each ID class that either fetches a value from the cache or creates a new value in the cache if you're the first to request this ID. The toString() method generates the String from the ID.

So when you're serializing a bunch of JSON or XML, you want to write out the simple String representation and read in the String on the opposite side and then use it to fetch an ID from the cache instead of creating a new instance of the ID. It turns out that you can do this with just *two* Jackson annotations.

You tag the toString() method with the @ JsonValue annotation. This tells the Jackson framework that this is the only value that they need to serialize out to describe the contents of this class.

For the inbound side of the serialization, you tag the valueOf() method with the @ JsonCreator annotation so that the Jackson framework knows to call that method instead of a constructor.

Two annotations and it all works.

Cool!
billroper: (Default)
Spent some time with one of the other senior programmers on Zoom today discussing the use of Java Enum values across multiple closely related classes and how best to structure this to avoid insanity. He gave me one approach, while I've simplified it a bit, I think, without penalty.

We'll see how this looks tomorrow morning.

It Lives!

Oct. 23rd, 2023 06:54 pm
billroper: (Default)
It lives! The massive refactoring of code that I've been working on finally does something useful.

Now, I need to make sure that it does *all* of the useful things. :)
billroper: (Default)
I have been working, off and on, on a massive code-refactoring project. I am getting closer and closer to the end of this, but I discovered today a number of classes that wanted to move from one package to another, because they needed to follow the classes that I had already moved.

The good news was that Git Bash and Git MV managed to get them to their new locations without dropping all of their history on the floor. :)

I have done quite enough work for today and am ready for the weekend.

199

Sep. 12th, 2023 08:51 pm
billroper: (Default)
Adam Wainwright finally got his 199th win for the Cardinals tonight. This is primarily important, because you have to get 199 wins before you have a shot at getting 200. Now, we'll see if he can do it before he retires at the end of the season.

In other news, I have now fixed the thing that was causing the problem as well as the things that were wrong but weren't the proximal cause of the problem. At least, I *think* the thing is fixed. My *test* says it is fixed.

On the other hand, there's *another* thing that I fixed that I'm being told isn't fixed, but when I tested it on my machine, it was fixed. There are days I wonder what's in any given build that is handed off for testing...
billroper: (Default)
I have fixed several problems. Unfortunately, none of them appear to be the problem that actually needs to be fixed at the moment.
billroper: (Default)
There is something satisfying when you find the source of a calculation problem that fails exactly *once*, after which you have to tear down the entire structure and rebuild it to get the calculation to fail *again*.

Happily, I now know how to make the problem go away, which I will do on Monday.

Now, I am giving it up for the weekend. :)
billroper: (Default)
Today, I was finally able to merge a couple of small projects of mine that had been hung up waiting to pass regression testing. While they weren't of great consequence, they both added some nice bits of functionality and it's good to get them into the main code line, even if users are unlikely to notice them.

The *next* project on my list goes into regression testing next week, assuming everything goes according to plan. And *this* project will get noticed by users, some of whom know it's coming and are eagerly waiting for it. We'll see how it goes.

Profile

billroper: (Default)
billroper

May 2025

S M T W T F S
     1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 23rd, 2025 12:23 pm
Powered by Dreamwidth Studios