Sunday Morning, Charles River

One of the things the fall brings is shorter days. The earlier sunsets are the most noticeable, but sunrise is getting later too. In June, sunrise was around 4:30-ish, now it’s around 6:30, and will be getting later still over the next six weeks, until Daylight Savings Time ends.

This later sunrise makes it easier to haul my sorry behind out of bed to see the sunrise. I tend to wake up early anyway — 3:30 – 4:00 is not uncommon, but usually I just roll over and try to go back to sleep.

I decided this weekend to see if I could get up early enough to be on the Charles River for sunrise. It’s something I’ve been thinking of doing for a long time. Since downstream faces East, I figured I could get some decent pictures.

The forecast Saturday morning called for temperatures around dawn of around 49°, so I decided to see if I could do it this morning. I put the kayak on top of the car last evening, and loaded the paddle, PFD, and wet socks into the back of the car and charged up the camera battery. I decided not to set an alarm. I figured if I was tired enough to sleep late, fine, I had the day to go paddling, but if I woke up early, I could decide then whether to get up and get in gear.

I woke up at 5:19 this morning — just early enough to give me a few moments to figure out if I really wanted to do this, or should I roll over and go back to bed. At first, rolliing over was mighty tempting — I’d been up late the night before, and I knew I had the whole day to go paddling. Then visions of the pictures I could take started dancing in my head, and I grumbled, got up, slurped down some yogurt, put some coffee in the travel mug, and headed into Cambridge.

The closest put-in to downtown Boston is Magazine Beach in Cambridge. Driving in, there was just the faintest blush of pink in the Eastern sky, and I had the sinking feeling this was all for naught — that there was too much haze overhead for there to be a sunrise.

Sunrise this morning was at 6:29. I got to Magazine Beach at around 6:20, and the sky did not look very impressive. But I figured I was there, so I might as well go for it. It takes about 10-15 to get the boat off the top of the car and into the water. I put the drybag with my camera and phone in the kayak, and did my usual oh-so-graceful entrance, and I was off.

By this point, it was around 6:45, and I figured I was probably too late, but then I cleared the rushes at the edge of the river, got into the middle, and there, behind both the BU and railroad bridges, was the sun, rising over Boston. I didn’t want to include the bridges in my photos, so after a couple of minutes of semi-frantic paddling, I was in position to take some pictures. The masthead picture at the top was taken with my iPhone; the rest below were taken with the Nikon.

Even past sunrise, I figured the earliness of the hour had advantages. While the sun was still low, it was warm in color, and I got some nice picture of the sun shining on the granite piers holding up the Mass Ave bridge.

Passing MIT, I could see the sun glinting on the water in front of the MIT dock with all its sailboats. And I got a picture of the sunlit side of the Hancock tower glowing in the morning sun.

Continuing on, with the sun in the east, there were several structures, like the ornamentation of the Longfellow Bridge and the downstream side of the Green Line’s Charles River viaduct that were in direct sunlight, that I had been used to seeing in the shade.

I finally turned around under the Zakim Bridge. The supports for the bridge are massive.

The supports of the Zakim Bridge

On the way back, I got a picture of the railroad drawbridge I’d paddled under, and then a number of pilings between the drawbridge and the Viaduct:

As usual, it was choppy between the Museum of Science and the Longfellow Bridge, so I was happy to duck into the calmer water of the Esplanade lagoon by Community Boating. As I passed through the first lagoon, the Arthur Fieldler head came into view.

By this point, I was anxious to finish up the trip. I’d been in the boat for nearly three hours, so I was taking fewer pictures. One of the last one was this monstrosity going up on the BU campus.

I have since learned it’s the BU Data Science building. What a self-indulgent piece of crap. When I think of all the engineering wasted on making this “statement”, it makes me angry. Buildings are public artifacts, and they should not detract from their environment.

I continued on, heading upstream into the wind, passing the BU Boathouse, and then the railroad bridge and BU Bridge. There’s a small campsite nestled under the BU Bridge; unnoticeable from the road, but quite visible from the water. The the Magazine Beach dock came into view, and it was time pull out, pack up, and head home.

Photo:Hour

I realized the other day that it’s been just over forty years since I started my first full time job, at a one hour photo lab called Photo:Hour.

I’d majored in Elementary Education, to be a teacher, right in the middle of the demographic ebb between the end of the Baby Boom and the Boomers starting to have their own children. This I knew going into it. And then, the November I graduated, Proposition 2 1/2 passed, cutting property taxes, and suddenly schools were laying off teachers.

I’d seen an ad for an assistant manager position for a photo lab in January of 1982, and interviewed in the basement office of the Winter Street store with the owner, Tom Giampapa, and then… heard nothing. And then six weeks later, they called. Turns out the guy they’d originally hired had quit. Still being unemployed, I took the job.

When I started, one hour photo processing was brand new, and we were the only lab in all of New England. It also helped that Tom had a friend in the company that did the MBTA’s advertising; we had car cards in every Red and Orange line train.

For the first year, the store was crazy busy. It was Gary, the manager, Marcial, a full time employee who was great in the lab, but whose English wasn’t good enough to work the counter, an ever changing cast of part timers, Tom, and myself. Tom split his time between working the store and scouting out locations for our second store. Generally, I would open and take the 8 – 4:30 shift, and Gary would come in at 9:30 and close at 6.

I always thought of it like a photo MASH unit — meatball photography, try to do a good job, but never enough time to do as good of a job as you would like. There was never enough time to do all the maintenance needed, to run all the control strips you were supposed to, or make over all the pictures that needed it. On the other hand, I know for a fact that our work was better than a lot of other places.

Part of the problem was that the company just didn’t pay well. We paid lab techs slightly above minimum wage, but not much, so we were always losing people. It happened over and over again — we’d hire someone, get them trained, we would run fully staffed for a couple of months, and then they’d quit, and we’d be short handed again. My dominant memory is running crazy busy because we didn’t have enough people.

Besides the counter, there were three positions in the lab — film load/unload, printing, and packaging/QA. Loading the film processor was pretty easy — the hardest thing was training people NOT to put the wrong kind of film in it, and packaging the pictures up was relatively simple, and most people were able to pick up what our standards were for pictures that required a redo. But printing…. that took a while to learn, and some people never could learn to do it well, or quickly enough. You had to pull the film strip through the negative carrier, and then make a judgement about the subject of the film, and bias the exposure accordingly. A picture on the snow? Use -3 density. A picture shot on flash against a dark background? Use +5 density. You could be off by a button either way and still have an acceptable print, but beyond that, the print would either be washed out or too dark. And you had to decide fast, there was no time to agonize, and in fact, the best operators used what I called Force printing (as in “use the Force”)

As an assistant manager, I was also responsible for helping to keep the lab running properly. Every day we would run “control strips” through both the film and paper processors. These were Kodak-exposed pieces of film and photographic paper that we would run through each processor, and then read on the densitometer and compare the readings to pre-processed sample. If the control strips were within certain bounds, the process was healthy. If the plots crossed certain limits, you needed to take action, and if they were outside the outer bounds, you were supposed to stop.

We would also expose a “bullseye” print every day, using a test negative and accompanying test print. Again, we would read the result on the densitometer, and if any value was more than four points away from the standard, or if the largest difference was more that five points, we had to enter a correction into the printer, rerun the bullseye, and hope it was better.

On a monthly basis, we would check the channels for individual brands of film, and make corrections. I always hated this job. On the one hand, the work did tend to look better when the machine was in tune. On the other hand, the densitometers Tom bought were always flaky and prone to variations, so it usually took several tries to hone in.

I was just starting to feel comfortable that I had a handle on the job in early 1983. Tom had signed a lease for a store in Medford, and we planned that Gary would take that store and I would take over Winter Street. And then one morning, Gary was late. Tom came in, and went downstairs to look at the previous day’s receipts. Minutes later he was back up stairs; Gary had taken the money, left a note, and disappeared. Three weeks later, the state police came by looking for him, for what, I don’t know.

That was one of the craziest periods I can remember. We were about three weeks away from opening Medford, and suddenly, we not only had to set it up, but we had to hire and train a second manager, as well as a replacement for Marcial, who we were going to transfer to Medford. I was basically the only person who knew how to handle the machines and their set up, and I was working six days a week. This led to the My Dead Body Story.

We’d managed to hire a couple of new people to fill the manager and assistant manager slots and they were all working Winter Street, trying to learn the ropes. The Medford store had been built, the machines installed, and were up and running, but the printer needed to be programmed — the same process as above, balancing channel 00 using bulleyes, then setting up the individual channels, only all from scratch, and all at the same time. Tom called from Medford and told me to get a taxi (my first one) and head over.

As soon as I get there, we get a call from Winter Street — paper is jamming in the dryer and they can’t get it to stop jamming and I can’t talk them through it on the phone, and they’re falling behind. So I head back to Boston, get them fixed, and help them get caught up. By 4, it looks like we’re stable again, so I head back over to Medford.

Tom and I work until 10:30, sort of getting the printer balanced. He’s promised to drive me back to the Route 128 station, where my car is parked, since there’s no train service that late. He stops at a 24 hour gas station near Wellington Circle for gas, and then gets partway around the circle before his truck starts to splutter out and die — the idiot attendant had put diesel fuel in the gasoline tank. Tom manages somehow to coast back into the station, which is now closed while the attendant has a drink, and calls his wife to pick us up. It takes a while since she has to pack the kids into the back of the station wagon and then drive over to Medford.

In the meantime, Tom has discovered a petcock on the bottom of his gas tank, and decides, when his wife gets there, to have her tow us, with the petcock open, through the streets of Medford, only to find there are no others open. Defeated, he then heads back to Route 128 to drop me off. It’s about 1:30 now, the place is deserted, and I just want to get to bed since I have to be back at work at 9.

As I walk up the road to my car, I see another car coming down the road towards me. Uh oh. Is it some teenagers looking for a place to drink? Is it the police? No, it’s my mother, with the dog in the back of the car, looking for my dead body. “Get back home” she snarls; the end of a perfect day.


I was with Photo:Hour for around 17 years, which was about 16 too many. I went from store manager to district manager back to store manager to running the Hanover store myself as the company grew and then contracted. I came to really despise myself for sticking around, but I couldn’t bring myself to find another job. Jon Landy, who became the first manager of Medford, then moved back down to our big Washington Mall store in Boston and I used to discuss it; we felt the same way. “Why am I still here?”

It was a combination of things. In the beginning, Tom was holding out the possibility of promotion as the company grew. He kept telling me that once we had enough stores I would take over the job of supervising them. Eventually, I did do that, but then business took a turn for the worse, and I was back where I started.

Then there was a sense of not having any skills that anyone would want. By the mid 90’s, I’d become a decent computer user, but had no programming skills other than a little BASIC, and the development job market was harder to break into back then, or at least, it appeared to be.

Also, I was definitely fond of Tom Giampapa. He was cheap, for sure, and we were all convinced he was being penny-wise and pound-foolish by not investing in advertising and picking less than optimal locations. But he could be a hell of a lot of fun to be around. When things were going well, he had a big booming laugh, and a great sense of humor. And I always, always, felt that he was looking out for me. My last job, at Andela, the pay was great, and the benefits lavish, but I never had the sense they had their employees’ backs. For Tom, firing was a last resort, not a first.

And finally, he gave me the scope to keep the job interesting. If there was something that needed to be done, and it looked interesting, I could do it. As long as the store was running and the customers were coming in, he was happy. I wanted to do the redesign of the photo processing envelopes? He let me. I had an idea for turning a roll of edge-fogged paper, useless for customer work, into coupons? Great. In hindsight, working now where everything has to be on a ticket, and assigned to the current sprint to take it on, being able to have ideas and act on them with little interference was a wonderful thing,

New Apple Silicon Mac

Last fall, Apple replaced their Intel based MacBook Pros with new ones using Apple Silicon. This past November, I bought one, replacing my previous Intel 16″ MacBook Pro with the M1 Pro equivalent.

If I’m being honest, I really can’t justify the purchase, other than “I wanted it, and can afford it”. The old computer was only two years old; typically I’ve gotten at least three and sometimes four years out of a computer before getting a new one. But everything I’ve heard and read about these new computers said they were fantastic.

A couple of years ago, I wrote, “Apple has gotten to a place where each new product is just as notable for the things that have been removed as they are for their improvements.” This generation of computers reverses that, and makes just the set of trade-offs that I asked for — it has built in ports for SD cards, HDMI, and a MagSafe power adapter; instead of optimizing for being as thin as possible, it’s designed to provide the utility people need while being no thicker than necessary.

The other big change is the heart of the computer. My previous Mac used an Intel central processing unit (CPU). Now, Apple is transitioning to its own series of Systems On Chip (SOCs), the M1 series. They started in late 2020 with the low end, the M1. This year they extended the line with the M1 Pro and M1 Max, which have more high speed cores, more graphic processing units (GPUs) and more memory bandwidth for more demanding uses. The two chips have the same number of processing cores – 8 performance cores and 2 efficiency cores used to save power under light load. The difference is the memory bandwidth and number of GPUs — the M1 Pro has 16 GPUs; the M1 Max is available in either 24 or 32 GPU cores, and supports more memory.

As I said, I wanted this computer, but couldn’t honestly justify it. So I waffled a few weeks, and played with the configurator. There were two factors that decided me (besides the “I want it” factor).

The first is that this is a major change in Apple’s architecture for the Mac, and I wanted in on that. The current version of macOS does currently run on Intel Macs, but there are already a number of features that are only available on Apple Silicon. They’ve clearly decided that they’re not going to support Intel any more that they have to, and this will become even more pronounced as time goes by.

The second factor is that the trade in allowance for Intel Macs is dropping rapidly. Shortly after the new Macs came out, I ran through their trade in calculator, and got an estimate of around $1700. By the time November came, the trade in had dropped to $1300, and I knew that the price was going to continue to fall, and that I did want an Apple Silicon machine. I placed the order.

I went back and forth on it for a while, but I decided to go with the M1 Pro model rather than the M1 Max. For me, ample storage and memory are more important, and I was already spending a lot of money to match the memory and storage specs of my old machine — 32GB of memory and 2 TB of storage. One the one hand, going to the Max would have only added $200 – $400 to what was already a $3600 machine; and bragging rights would be nice, but I’m not a video producer and if I’m being honest, I’ll have a hard time pushing this machine to the limit.

It took about 3 weeks for them to build the machine and ship it; it arrived a couple of days before Christmas. I had one very bad moment when my mother’s home health aide said she’d found an empty box on the front steps; for a moment I had visions of my very expensive Christmas toy being stolen. Then I realized it was probably the trade in carton for my old machine. Heart attack averted.

Physically, it looks bigger than the Intel machine — the bottom shell of that machine was tapered beginning at about an inch and a half from all the edges, so edge-on, it looked thinner than it was. This machine has no taper, so it’s thickness is more apparent.

Transferring my data was simple; I just ran Migration Assistant on both machines and they transferred my data from the old machine to the new wirelessly overnight.

Both machines were running the same version of macOS, so there was no dramatic difference in the experience of using it. The first thing that struck me is that the screen is sharper and more brilliant; I was looking at some fall foliage pictures I’d taken, and was just blown away how sharp and detailed everything looked. There is a smidge more vertical space because there is less bezel at the top. The price of the increased space is that there is a notch at the top of the screen where the camera is. In practice, you just don’t notice it.

The next most noticeable thing for me is that Photos has become a lot more responsive. I’ve been re-adjusting old pictures and it’s pretty snappy.

On the downside, I’ve been finding a lot more software issues that I’m accustomed to in a Mac. I keep getting messages that “suggestd”, an internal daemon, has crashed, and it’s been having trouble completing its first Time Machine backup.

Overall, I feel a little guilty having spent a lot of money I really didn’t need to, but I’m happy to have it and look forward to seeing what kinds of things running Apple Silicon will allow.

Making of a Christmas Card, 2021

It took me a little while to come up with an idea for the card this year. I did take a second look at some of the Christmas light photos I shot in 2016 for the card that year; as it turns out, the same pictures I decided not to work with then, still didn’t speak to me now.

There is also a part of me that is getting tired of creating a new card each year; at some point the card will be a photo of all the prior year’s cards in a basket, and that will probably be the last one. I’m not quite at that point yet, though.

Mum and I got our COVID booster shots at Walgreens a few Saturdays ago; when you get a vaccine dose, you have to stick around for 15 minutes just in case you have an allergic reaction so that they can respond to it. So we fumfed around the seasonal aisle there, and they had a gingerbread house kit. I saw it, and went hmmmm.

Comes a week later, and I still hadn’t gotten any other ideas, so I decided to do it. So I went back to Walgreens and picked up a gingerbread house kit. I realized I needed something to act as a snow surface, so I went over to Michael’s to find some fake snow. I could not find any, and I couldn’t find a single staffer in the store who wasn’t running a register to help me. So I picked up a bag of white cotton, and some deer figurines and miniature trees.

Putting the kit together was pretty simple — the only surprising part was how long it took, because there were several points where you glue a couple of pieces together with icing, and then have to let it sit for 15 minutes while the icing set.

The photography was a problem. What I should have done was pick up a piece of white posterboard to act as a seamless background. What I did do was use the “desktop studio” I got a couple of years ago. It’s basically a 16″ x 16″ x 16″ lightbox, with a small pair of halogen lights to be positioned outside the studio, with red, black, white and blue backgrounds. The sides of the box are intended to diffuse the light to provide a nice soft illumination of the object inside.

Unfortunately, the studio was a little too small for the gingerbread house. It was hard to frame the picture so that the sides of the studio were not too visible. The backgrounds are not really seamless, since they came folded, and have a number of creases. I managed to get a couple of pictures, and then decided to try repositioning the lights outside the studio. While moving the right side light, the cord on the left side light got pulled, it fell off the table, and blew the bulb. So now, I had to live with one of the shots I already had.

None of them were particularly good; this one was the best of a bad lot:

Original picture, taken inside the desktop studio

It’s reasonably evenly lit, but the background is very visible, and the rightmost tree is crooked, and the cotton is pretty sparse in the left front. This turned out to be a fairly major Photoshop job.

First step was to do some basic color correction and lightening of the image.

Second step was to run a Gaussian blur against the background. I selected the area behind the scene, and run a strong blur against it.

Next, I used the stamp tool to even out the cotton “snow”

I’d created two different exposures of the photo when I ran the picture through Camera Raw; now I copied the left side roof from the darker version and combined it with the lighter version, where the roof was burned out.

Then I selected the rightmost tree, and rotated it a few degrees counter clockwise to straighten it out. I ended up using parts of the original layer underneath the working layer, but it ended up OK, even though I probably didn’t do it the right way.

The background was still too dark, so I masked the scene, and started lightening the background, to get it whiter.

Finally, I added some decorations and lights to the trees, then masked out a vignette area around the edges so that the photo would fade to white when printed on the card.

Then I brought it into Pages, using one of my prior year’s templates. When I printed it out, I found the background was still too dark. I ended up just making most of the background part of the scene transparent, so that when laid over a white background, it was white. In hindsight, I should have just extracted the scene from its background, and called it a day. I’m not thrilled with the little vestiges of the blurred background around the scene.

The next problem was what to put inside the card. The only card stock I could find at Staples when I went was half fold card stock, meaning the cards would be full size. I worked off my 2018 card, renamed the file, and changed the images inside. Unfortunately, I just haven’t done much interesting this year, so picking the pictures was hard. I ended up choosing half the pictures from our time on the Cape, and the last couple from a kayaking trip on the Charles.

Inside of the card

For the text, I decided to riff on the subject matter and wished people a Merry Christmas and a “Sweet” New Year.

Once again, I decided to include Mum on my cards. People we both knew got a card from both of us, and I basically let her decide what I would would write. She doesn’t have enough dexterity to sign them anymore. For the cards from me alone, I wrote more of a note. I had most of the cards finished and in the mail by the first week of December.

Merry Christmas Everyone.

Updates

I mentioned in passing in my Concentration posts that I had been laid off at the beginning of September. I’m happy to say I’ve joined athenahealth (yes, that’s the way it’s capitalized) as a “Senior Member of the Technical Staff.” The company offers a variety of Electronic Health Record (EHR) and billing products, making it easier for health care providers to focus on what they want to do — care for patients — by relieving them of the scut work of dealing with payers, managing scheduling, and making it easier to record health information.

The company also provides a number of open Application Programming Interfaces (APIs) that athena partners can build on top of to provide additional functionality, and has a Marketplace to enable providers to find the partner’s products that they need for their practices, and that’s where I’m working, on the front end, learning React.

I got the job at the beginning of October, and started at the end of the month. The first couple of weeks were spent on orientation. athena is easily the biggest company I’ve worked at, and because it’s in a very regulated industry, there are a lot of rules to learn, and things to get up to speed on. I finally got to start working on the code, and it’s going well.

I mentioned that there was a gap between accepting the offer and starting. After all that’s gone on this year, I wanted to take some time for myself, and that’s part of the reason why losing the bike to mouse damage was so distressing. Here I had some free time, the weather was great, and no bike. So I rented a Triumph Bonneville for 24 hours. The Bonneville looks very much like the bikes from the early 1970s that I first fell in love with. The first day, I took the bike out to Quabbin Reservoir, and discovered very quickly how much wind protection my own bike provides. Five minutes after leaving the parking lot, I was chilly. The bike felt so much smaller than my own bike, but was easy to handle. The foliage was really pretty heading out to the reservoir. By the time I got there, there was an overcast, and I was downright cold. I stopped at a dollar store to pick up a long sleeved shirt, and on the way back, going through the center of Ware, I saw a clothing store, stopped, and picked up a fleece.

The next morning, I took the bike down along the South Shore, and ended up in Plymouth, by the harbor, and had a view of the Mayflower II. I had lunch, and then headed back.

They started working on the bike a couple of weeks later. They repaired some parts of the wiring harness, and started addressing the damaged taillight wiring. I chose to have that replaced; when the parts came in, they then found that the turn signals weren’t working, and it would take several hours to remove the body work and diagnose the problem, and was this something my insurance covered? As it turns out, my comprehensive did cover it. The total bill was around $2200. I chose to have them keep the bike there in winter storage, so I wouldn’t have to worry about further mouse damage. Very expensive mice indeed.

More Concentration

I recently recreated my Concentration game in Angular, to have a current example of what I can do (It’s worked). I’ve had some time to polish it, so I’ve just pushed up a new version.

I recently had to do a take-home coding challenge, and one of the things they mentioned was adherence to the Angular style guide. I figured it was best to re-read it before starting, and one of the things it mentioned was that computational code was better off in a service rather than a component. Well duh. I immediately realized that one of the things I’d done when I ported the jQuery version over to Angular was to carry over all the code to generate the puzzles and trilon data into the ConcentrationComponent. I’d even noticed that the component was bigger than I’d like it to be, and then shrugged and moved on. Of course, that code should be in a service.

Moving that code to a new PuzzleService meant that the ConcentrationComponent got a lot smaller. It also means that if I ever decide to move that code to the server, which it would need to be to have two players playing remotely, that the ConcentrationComponent is in much better shape to receive the data.

I was finishing up the service and the unit test changes needed, when I idly remembered that I’d intended to add the sound of the trilons spinning to the original game. I didn’t pursue it very far then, because I couldn’t find a clean sound sample. I decided to see if I could pull one off YouTube from the original show. There aren’t many episodes of the original show online, and the sound was not very clean, but I did find a copy of one of the syndicated shows with Jack Narz that I was able to get a clean clip from. A little online searching, and I figured out how to tie it into the game. Win!

Except, that you really can’t add sound to a web page without giving the user a way to turn it off, especially a sound like the sound of a trilon turning. This meant I had to add a user interface to control the sound. And then I got thinking…

I’ve always liked the basic design of the original game board, with light colored borders, and a central, darker rectangle with light colored numbers.

Original Concentration board

When the 1970’s syndicated version came out, the board got a garish new look:

Syndicated game board. Classic Concentration kept this color scheme, replacing the mechanical board with a computer generated one of 25 pieces

I just hated this look, and from the start, I decided my game would have a version of the original look.

And yet, since I was adding a preference for the sound, how hard would it be to add a preference to use this color scheme? Not very, it turns out, and with the power of Cascading Style Sheets (CSS), I could even have a cool transition between looks.

One thing I did pick up from the syndicated version was the colored puzzles. The original producer, Norm Blumenthal, refused to add color, as he felt it would make the puzzles too easy to guess, incurring displeasure from the network, which wanted to convert all its shows to color. He ended up compromising, making the puzzles pink on maroon. Personally, I think he was wrong — color can be used to misdirect as easily as it can give a puzzle away. When the show moved to Hollywood, the new producers had no compunctions about making the puzzles in color, and that’s how I’ve made my puzzles.

But then I got to thinking… CSS now has filters that can be used to alter the appearance of background images. If I combined a grayscale filter with an invert filter, maybe my color puzzles would look like the original Blumenthal style. I tried it, it’s not perfect, but it’s a decent approximation, so I added an option for that.

Adding options is good, but what’s the point of having options if you have to set them every time? (This is how “scope creep” happens, boys and girls). I added a LocalStorageService so that the user’s choices would be preserved, and a reset button to restore defaults.

There is also one more puzzle.

So what was intended to be an internal rewrite ended up being much bigger, adding the ability to play the sound of the trilons turning, and the ability to change how the puzzles and numbers look.

Take a look, and if you are so inclined, take a look at the source.

Damned Mice

I got a custom Corbin saddle for the FJR in August. Overall, it’s been comfortable, and lowers the riding position so that I feel safer with it, but I’ve also noticed my back hurts. This is not necessarily new, but I decided to put the stock seat back on, and check it out.

When I did, I found the under-seat area was filled with pink fiberglass insulation taken from an old roll that’s been in the garage for decades. Clearly, mice have found the bike.

Mouse nest

Worse, they’d found the insulation on the wiring harnesses tasty, and had stripped the insulation off.

Bare wires

So now, I have some free time, and the peak foliage season, and I don’t dare use the bike because the electrical system is likely to short out if the wires happen to touch.

About the only good thing about the situation is that I discovered it in the driveway instead of being stranded someplace. I’m enough of a believer in Murphy’s Law to know I’ve dodged a bullet, but the shop can’t even look at it for a couple of weeks, and who knows what they’ll find then. I’m hoping the wiring harness is orderable as a unit, and can simply be replaced completely.

Concentration/Angular

During my job search in 2014, I dusted off my old Concentration game, and polished it up, and came up with a nice version with spinning trilons. I wrote it in Javascript and jQuery, and it helped me get the appScatter job.

A couple of years ago, while I was interviewing for Andela, Tom offhandedly asked me if I had any code samples they could look at. I said it was old, but I’d send them the link to the Concentration game repo. When I looked at the repo, I cringed — front end development has changed a lot in the past couple of years, and the Javascript code was very old school. A promise is a promise, though, so I sent off the link to the repo, and asked them not to look at the syntax itself, but the code organization and program logic. I was really afraid I’d shot myself in the foot.

I, and the rest of my team were laid off at the beginning of September, and I was determined not to repeat the mistake, so I decided to re-implement the game in Angular, to demonstrate what I can do. Along the way, I also rectified the major issues with the original:

  • The original was not responsive, and not really playable on mobile. Although I planned to, I never did fix this on the original, because I never could figure out how to preserve the look of the scoreboard and figure out a place to put it. In this version, I solved it by making the scoreboards variable height, and stacking them vertically underneath the puzzle, on mobile.
  • The way the original code was organized, I could never solve what I called the “Double-wild” problem. It’s rare, but it’s possible to match the two Wild Cards with each other. On the show, this is handled by letting the player pick two more numbers for two more prizes. It’s rare, but I ran into this an annoying number of times with the original version, which treated the Wild Cards as just another prize. The new version now handles this during the number-click handler.
  • It’s also possible for a player to match the same prize twice via Wild Cards. On the show, this was handled by showing a checkmark next to the prize if two had been won; on the original version, I simply showed two copies of the prize in the scoreboard. The scoreboard now recognizes duplicates.
  • The original version did not recognize retina screens. The new version does; I’ve re-created the puzzles, and now there is a high res version of each puzzle. There are also two new puzzles.
  • There were no unit tests on the original, this version has complete coverage.
  • I also added an animation as prizes are added to the scoreboard that pleases me no end.

At first glance, the new version looks the same as its predecessor, but it’s very much changed. I did start with the original styles and basic HTML, but the code layout is very different. The original consists of one HTML file, one stylesheet, and one Javascript file. The new version has one main component, the ConcentrationComponent, which handles the work of randomizing the puzzles and prizes, handling clicks on numbers, and recognizing and handling matches.

I’ve offloaded other parts of the game to subcomponents, though. There is one component to handle entering the player names, or choosing to play single handed, another to lay out the solution form, a dedicated component for the trilons that comprise the game board, and a separate component for the scoreboard, which handles the complexities of showing the prizes won and dealing with Takes and Forfeits.

It’s been interesting comparing the differences in approaches between the two versions. A lot of the game board in the original was generated in code, via direct DOM (Document Object Model) accesses. In this version I created HTML templates, and let Angular deal with creating multiple trilons, or iterating over the set of prizes in the score board.

One problem I ran into when I pushed the game up to the website was that the links to the images didn’t work. The original is in a subfolder of the site. I was able to get the new game working by changing the base href of the html file, but the images still didn’t work. I’ll have to figure this out, but I decided to set up a subdomain, which is probably easier to remember anyway. You can find the game at http://concentration.tedohara.net/ Give it a whirl, and if you’re so inclined, take a look at the code.

Ten Years of tedohara.net

Ten years ago, I was sufficiently worried about my job that I decided I needed to have my own web site. I”‘m a developer, I should have a site”. About what, I really didn’t think much about; I figured I would post items about web development, but the main point was to have a site with my own design and my own CSS.

It took me a while to get going. I procrastinated for a while, and then it took me a while to settle on a hosting company. I didn’t trust any of the hosting reviews, as they were either complete raves, or complete rants. I ended up at DreamHost, and I have to say, I haven’t had any serious problems over the past 10 years.

Once I’d decided, it took me a couple more days to bring myself to pull the trigger, and I finally signed up and registered tedohara.net, tedohara.org and tedohara.com on August 11, 2011, which was a Thursday. I set up tedohara.net to be hosted, and set up the other two domains to redirect to tedohara.net. The domains became live on the internet the next day with a parked site, and I spent Friday night playing with the features of the DreamHost control panel — configuring things, and setting up email addresses. (One thing I love about having my own domain is that I can set up multiple addresses I can control).

I knew I wanted to use WordPress, and I knew I wanted to set up my own theme. On Saturday morning, I downloaded WordPress, and uploaded it to the site, and set it up. Then I signed into the WordPress admin for the site for the first time, played with some of the configuration options, and dashed off my first post.

It took me a couple of months to make it look the way I wanted it to look. It turned out I liked the big banner image at the top of the page, and it turned out it was easier to create a child theme of one of the existing themes than it was to build out my own theme from scratch. I settled on a font I like, and a color scheme I like, and deployed it New Years Eve of 2011, and haven’t really wanted to change it since. I know I probably should, but I still like the way it looks, and I occasionally still tinker with it; for example, at the beginning of this year, I made the theme responsive, and I have a set of Christmas overrides that I enable around the beginning of December.

In terms of content, it’s kind of become whatever I feel like talking about, when I have something to talk about, and have the time to write. I kind of lost interest in writing about web development a while ago — the last thing I got excited about was a post about AngularJS Promises that never came to fruition It’s mostly evolved to social commentary, like my last post, and photography.

I do like rereading my old stuff, and I do have my favorites. I discovered pretty early on that I liked chronicling my vacations, especially my trips to Bonaire. Blogging on vacation takes a little bit of discipline — I need to set aside time to quickly review the pictures I’ve taken during the day, pick a couple that I can color correct and edit easily, and then write up the day. By the end of the week, I find myself kind of bleary-eyed, posting after a day of diving and then going out for dinner, but I’ve found I really like these posts, and people tell me they like them too. Then, once I get back, I process all the pictures, and post photos from each day of the trip. It takes a lot of time, but I am so glad I did it — It’s fun on a cold winter’s day to look at past trips.

Of the personal posts, I think “Hard to Believe, But Not Hard to Believe“, about the 35th anniversary of my father’s death, is the first one that comes to mind. Not only is the subject matter important to me, but I think the writing is good too. There is a rhythm to it that I was striving for, and I think I achieved.

Of the social commentary — depending on my mood or positivity, I post them under either “Thoughts” or “Grumbles” (or both) — there are several that please me:

  • I Expect My Leaders to be Grownups, about the Supreme Court nomination, actually got a little bit of traction; I at-replied to Marco Arment on Twitter with a link to it, and he retweeted it to his 100,000 followers. I remember being nervous about posting it and tagging him on it, but I got an overwhelmingly positive response.
  • The two posts about the 2016 election, “How Did We Get Here” and “So Trump“. I think my analysis of how we got there is correct, and unfortunately, Trump turned out to be much worse than I anticipated, because he did not believe in the rule of law.
  • The posts about my Christmas Cards. I’ve long had a personal tradition of creating my own Christmas cards, and in 2013, I started writing about them. I still think both the 2013 card and the post about it was the best.
  • The Perfect Tree, about the quest for a perfect Christmas Tree

Of course, I don’t always succeed. It seemed for a while I was writing, but not quite making the point I wanted, or not writing with the kind of voice I want. I think my biggest recent whiff is the piece about the January 6 riot at the Capitol, “This is why you teach history” I think the post kind of meanders, and never fully makes the point I wanted, which is that an informed, well-taught electorate wouldn’t fall for the kind of candidate who would lead them to insurrection.

I never have been able to keep to a regular posting schedule. Up until Mum’s first stroke, I always aimed for at least one post a month, but it’s been hard to keep up with that. It’s easier when I’m doing stuff that gives me something to write about, like a vacation or trip to London. I’m noticeably more active in the summer, as I (used to) dive then, and take pictures. I’d like to get back to that, sometime, but I have very little time for myself now. But I do still like having my own website, and having a place of my own that I can post my pictures or say what I want, and have it be mine, not some social media platform, even if no one other than family is reading it. And so, I couldn’t let this tenth anniversary pass.

The Tyranny of the Stupid

I think the single most upsetting thing about the pandemic is the sheer amount of stupid running rampant in the country. This country, that once sent men to the moon six times and out-fought and out-manufactured the Axis powers in World War II, has fallen prey to nitwits and charlatans who won’t take the science of the situation seriously.

These folks are so adamant about asserting their personal freedoms that they forget that with freedom comes responsibility, including the responsibility to choose to do the right thing, both to protect themselves, and others. You may have the right to be stupid, but you shouldn’t choose to be, and your right to be stupid ends where it affects my freedoms.

Last year, because we were stupid, we let let the pandemic get out of hand. Because the stupid would not refrain from gathering, and refused to wear masks, the virus spread further than it should have.

Last Thanksgiving and Christmas, because people were too stupid and too selfish to give up the gratification of holiday fun, the virus spiked, and people died. Needlessly.

Now we have vaccines that are highly effective, free, and widely available. And yet people still won’t take them. Because people are stupid, the virus is spiking again, and people are dying again. And for no good reason. While the vaccines are not completely risk-free, the odds of having a problem are exceedingly low. Millions of doses have been given out; the number of people who have had serious complications from the virus is around a couple hundred,

Because people are stupid, COVID restrictions will be coming back, even for those of us who have been vaccinated. Because people are stupid, there is more COVID around, and the odds of vaccinated people getting a breakthrough infection are higher. It won’t send us to the hospital or kill us like it would an unvaccinated person, but it’s still needlessly unpleasant. And of course, it can kill the unvaccinated. But because people are stupid, mask mandates will be coming back for sure, and if that doesn’t work, authorities will have to decide whether to implement further restrictions to protect people who are too stupid to protect themselves.

Because people are stupid, medical people, who have been dealing with crushing workloads and the emotional burden of dealing with comforting dying people, are dealing with a new load, this time, more or less self-inflicted,

Because people are stupid, we are having get used to there being a spike in cases in the two weeks following each holiday.

I’m not asking for the government to require vaccines. But I wish people would freely choose to do the smart thing.