I got to play a few hands as well - I had a 16-pointer with five hearts to the ace and the singleton ace of clubs, so I opened 1H, Dan supported with 2H, and I jumped to 4H because my distribution was decent, but nowhere near slam potential. He bid Blackwood anyway, then passed my 5H. Fortunately, we only had two diamond losers, but Dan had an 11-point hand, which was worth a 3H response. I still would have closed at 4H, though. The hands still weren't quite up to slam standards. More interesting was S A-x H Q-9-x-x-x D 8-4-3-2 C Q-J. Dan C. opened 1C, Paul overcalled 1D, and I was clearly strong enough to bid 1H. Since we had an 80 partscore from the 4D, Dan passed that, and Paul bid 1S. I decided not to push 2H, since my holding was barely good enough for the first bid, but Dan raised to 2H, and over Paul's 3D, he bid 3H. When I saw his S J-x-x-x H A-J-2 D A-x C A-10-x-x, I thanked him semi-facetiously for his faith in my abilities and got to work. The opening lead was a low diamond, and I took the ace because there was no reason not to - the split could easily be 6-1 on the bidding. I figured I had little choice but to lose the kings of hearts and clubs and hope not to lose any further trumps, so I led a low club, and it was Dan who turned up with the king. He led a second diamond, completing his high-low, and Paul covered and returned a spade, which I took with the ace because there was still no reason to hold up. I cashed the jack of clubs, then led a diamond, which Dan ruffed with the 3. I was expecting that and was perfectly content to cover with the jack. I cashed the ace of clubs and threw the spade loser, then led the good ten, since Dan H. was marked with the last club and couldn't overruff. Paul surprised me by ruffing with the king. I thought about underruffing just to hang on to the diamond, but I didn't see any benefit to it, so I threw it away instead, leaving me with the five hearts I'd started with and nothing else. Rather unusual holding in a trump contract, I think. Anyway, the rest of the hand was pretty straightforward - Dan had the remaining trump, so I cashed the top two, threw to his ten, and claimed the rest to make the contract exactly, losing the king of clubs, the K-10 of trump, and a diamond. In the end, I had to thank myself for living up to Dan's faith in me. Good way to end a rubber.
Today's Work: I discovered that it wasn't the program clobbering my config files yesterday, but the install process. That kind of burns me up, honestly, but it just meant I had to work around the problem by keeping the files open and re-saving them every time I compiled the program. With that problem sorted, I moved a bit of processing out of a class where it didn't belong and into the class where it did, only to realize that that class isn't loaded until after it needs to have processed some data - a flaw in the Listener model, I think. I chose the simple but sloppy solution of adding an empty "init" function and calling it from the part of the program that initializes all the threads and services - I could turn it into a service and make it look a bit smoother, but there's really no reason for that. What I've got works, and the things that I think need to be fixed are pretty minimal. I can't really test it without hardware, though, and I have no idea when we'll be getting that. It needs to be done in August, so I'm guessing we'll get it in October or so. Well, that's too cynical. Maybe September.
Getting angry at people is wrong, even if there's only one thing that can cause it. I need to reduce that number of things to zero, like a normal person.