I use Python virtual environments a bunch at work, and this morning I finally put together a small helper script, saved as a Gist at GitHub, that makes enabling and disabling virtual environments a lot easier. I'm not sure why I didn't do this a lot earlier. Simply type work to enable the virtual environment, and work off to disable it. This script should be in your PATH, if it's not already obvious.

Here's the script itself:

@echo off

if exist "%cd%\venv" (
    if "%1" == "off" (
        echo Deactivating virtual environment
        call "%cd%\venv\Scripts\deactivate.bat"
        echo.
    ) else (
        echo Activating virtual environment
        call "%cd%\venv\Scripts\activate.bat"
    )
) else (
    echo No venv folder found in %cd%.
)

Stopping CVS Robocalls

Jan 23, 2020

In the past few weeks, I've received a couple of calls each day from CVS Pharmacy. I'm not sure what has changed on their end to cause these calls to start, but it has gotten annoying enough that I did some searching on how to disable them. Here's how to do it:

  1. Call 1-800-SHOP-CVS (1-800-746-7287)
  2. Say "More choices" (you may have to say this twice to get to the right menu; I did)
  3. Say "Calls"
  4. The system will confirm your phone number
  5. Say "Stop"
  6. Say "Correct"

How to Build a House

Jan 21, 2020

I watch far more YouTube these days than I do actual television. A series I just started is How to Build a House from the Essential Craftsman channel. In this series (that is still being released, as of this writing), they walk through the entire process of the house building process. From doing due diligence on the lot itself, to getting the building permit; from preparing the concrete forms to actually selecting the type of concrete (who knew there were different types?). I'm only about 15 or so episodes in, but it's been really eye opening in terms of the amount of work that actually goes into building a house.

Each episode teaches you something new, which has been a lot of fun. I recommend this series if you're a fan of This Old House or if you have an interest in how things are made. Here's the first video:

Simplicity in Design

Jan 16, 2020

One of the best things about picking up woodworking as a hobby has been the learning process. Every project has taught me a number of new things, whether it's a new tool, technique, or construction method. My latest project was a kitchen bench which I designed myself using Sketchup Make 2017. One of the lessons this project taught me was not to over-complicate a design.

The following images show two designs for the leg assembly for the bench. The first design is what I built; the second is a simplified variant.

The first design made attaching the bench top more difficult than it should have been at the ends. It also complicated the finishing process, and resulted in the purchase of additional material (4/4 poplar, in this case, rather than the 8/4 I used elsewhere in the frame). I only discovered this after building the first design, of course, but that's all part of the learning process. My intention with design 1 was to improve the look and feel of the ends of the frame, but the irony is that this portion is nearly invisible with the top in place.

As I design future projects, I now know to take issues like these into account.

I stumbled on this video over the Christmas break, and I've watched it several times now. Lots of good advice in this video on being more productive, and how working both smarter and harder, is a key to success.

While cleaning out my office this afternoon (some early spring cleaning), I found this blast from the past: an official hint sheet for the Castle of the Winds game for Windows 3.1. What a terrific game that was!

I remember ordering the full game directly from Epic MegaGames (yes, that Epic), and receiving both the 3.5-inch floppy and this sheet. I'm including some pictures of the sheet here for posterity, as I haven't seen it mentioned anywhere around the internet. Now it has been!

Hangman Anti-Tip Kit

Dec 2, 2019

One of the things we had to do after having our daughter was to child-proof a number of things around our house. Ensuring that bookcases (and similar furniture) didn't tip over was of primary concern, so I looked for various options. After trying some strap-style tie-downs (which didn't work worth a darn), I found the Hangman Anti-Tip Kit, which is marketed partially towards anchoring furniture in earthquake-prone areas. This device is simple to install, and is as solid as a rock. Highly recommended for those in a similar situation.

Deformable LED Lights

Nov 20, 2019
These bulbs died on me after about 21 months of occasional use; I replaced them in August, 2021.

Our garage has been lit by two 60-watt incandescent bulbs for as long as I've lived in this house (over a decade now). Until recently, that never really bothered me. Now that I'm into woodworking, however, and now that it gets dark early in the evening, the lack of light really started to strike a nerve. In thinking about potential solutions, I initially thought I'd install some LED strip lights in the ceiling, but doing this meant I would (a) have to mount the lights to the ceiling and (b) adjust the wiring for the existing sockets to accommodate for these new lights.

I found a much better solution in these deformable lights, which I picked up on Amazon. There are a million variations of these, from a million different Chinese companies, but these were some of the cheaper ones I found. The lights simply screw into the existing socket, and you can then point the three paddles in the direction you desire. I haven't used them a ton yet, but wow, the difference in illumination is night and day. I highly recommend them. Here's a picture of our garage taken tonight, with no flash:

About a decade ago (!), I posted some thoughts on several episodes of the original Star Trek series, as well as the original movies. Since that time, I've tried a time or two to try and watch Star Trek: The Next Generation, but I could never get past the first few episodes of the first season. Over the past few months, however, my wife and I have been giving it a good college try, and I'm glad that we've stuck it out.

Since I'm going through these episodes for the first time, I thought it might be interesting to share my thoughts as I proceed. I don't know how often I'll post my thoughts as I go, but I'll give it a shot over the coming weeks. I will certainly try to comment on any stand-out episodes we encounter.

Season 1 There's not much to redeem this season, so I'll keep my thoughts on this brief. Both Q-centric episodes were good, and I particularly liked Conspiracy and Heart of Glory. Data has a good backstory episode, and the Dixon Hill holo-deck episode was fun. Everything else was pretty much garbage.

Season 2 Starting off with a real stinker (The Child), I wasn't too optimistic about this season. It, too, is fairly uneven, with lots of forgettable episodes (the clip show being the worst imaginable). However, a few great ones stood out:

  • Loud as a Whisper was a solid episode about a deaf ambassador, played by a deaf actor.
  • A Matter of Honor was great television, wall to wall.
  • The Measure of a Man raised interesting moral questions about what it means to be human.
  • Time Squared was a fun time-travel episode with a neat ending.
  • Q Who was easily the best of the season. It introduces the Borg, was well acted, and had a terrific ending. Perhaps the best episode I've seen so far.

Season 3 We're only a few episodes in to this season as of this writing, but this has already been a solid season. It feels like a completely different show from this point. The sets are higher quality, the story lines are much more serious, and the acting is top notch.

  • The Ensigns of Command was a fun Data-centric episode.
  • The Survivors was super solid; it felt like an X-Files episode. Everything on a planet has been destroyed except a man, his wife, and the patch of ground around their home. Excellent episode.
  • Who Watches the Watchers was pure science fiction candy. Felt like something the one of the science fiction greats would have written.
  • The Bonding was a super deep episode about the loss of family members. Michael Dorn (as Worf) was excellent in this episode, and the cinematography was of note.

All in all, I'm enjoying this run through this old television show.

These days I find myself thinking about woodworking more than just about anything else; it's my new favorite thing! Here are a few of the projects I've completed over the past few months, in the order that I built them (the final project shown is not fully completed; it still needs sanding and finishing):

The table saw cart has been a great addition to my "shop" by giving me lots of storage for my tools (which are now nicely organized). I love having a new hobby that's in a completely different direction from my day to day desk job. Programming doesn't interest me like it once did, and having an outlet for creative energy has been quite cathartic.

We visited the J.C. Raulston Arboretum in Raleigh today. If you've never been, check it out; it's particularly nice this time of year. I of course took my camera and got some macro photos while there.

I maintain multiple tools at work that all run in Docker containers on the same machine. The overall setup looks like the following diagram:

Tool Network Diagram

The router container on top (nginx) routes traffic to the various application containers based on the hostname seen in each request (each tool has its own internal domain name). Each application has an nginx container for serving static assets, and a gunicorn container to serve the dynamic parts of the application (using the Django framework).

Earlier this week, I was trying to add a redirect rule to one of my application containers (at the application nginx layer), because a URL was changing. As a convenience for users, I wanted to redirect them to the new location so they don't get the annoying "404: Not Found" error. I set up the redirect as a permanent redirect using a rewrite rule in nginx. For some strange reason, the port of the application's nginx layer, which should never be exposed to the outside world, was being appended to the redirect!

Adding the port_in_redirect off; directive to my nginx rules made no difference (or so I thought), and I struggled for an entire day on why this redirect wasn't working properly. At the end of the day, I learned that permanent redirects are aggressively cached by the browser! This annoyance means you need to clear your browser's cache to remove bogus redirects. I wasted an entire day because my stupid browser was using a bogus cached reference. Ugh!

Garden Trellis

Apr 19, 2019

My most recent woodworking project was also the toughest one to assemble. This time around, I built a garden trellis to support the beans and peas my wife planted. Here's a picture (click for a view of the whole thing):

The legs and horizontal frames are all cut with compound miters at 7 degrees. This made assembly difficult, as there weren't any "flat" surfaces on which I could clamp things together. I purchased a cheap pneumatic nail gun which helped tremendously with this, but it was still a challenge. In the end, I think the final product looks pretty nice. Woodworking is a real fun hobby!

Switzerland by Rail

Apr 6, 2019

My wife and I often daydream about returning to Switzerland. One of the things we loved most about our trip there was the ability to go everywhere we needed via public transportation, most often on trains. Imagine my delight when, purely by chance, I recently happened upon a YouTube channel that is nothing but rail trips through Switzerland from the driver's point of view! There are hours and hours of videos, so I know what I'll be watching over the next few days.

I recently completed the first project of the online woodworking course I'm taking. Building this one was a lot of fun, and it was the first project I've put finish on (paint, in this case). My wife and I chose a bright blue color for the table, as it goes nicely with our orange-ish deck. This will be real useful to have on our deck when we grill or just sit outside to enjoy nice weather.

A few weeks ago, my wife and I watched the film All the President's Men, about the Watergate scandal. I had seen the movie before, but it was a real treat to watch it again (it's truly an excellent film). Seeing the movie got me interested in the book on which it was based, so I picked up a copy from my local library.

Wow, what a read! This book ought to be required reading for American citizens. Though it's a non-fiction book, it reads like an action adventure novel. It was difficult to put down, and was a real eye-opener into just how corrupt our politicians are. I cannot recommend it highly enough.

I've been interested in woodworking since I was little. As a kid, Saturday afternoons often involved watching This Old House, The New Yankee Workshop, and The Woodwright's Shop. Late last year, I decided a change was needed in my extra-curricular activities. Many of my existing hobbies were becoming less interesting to me, and I wanted a new outlet for my energy. Woodworking is the hobby I chose to pursue.

During the months of December and January, I voraciously consumed woodworking videos of all types on YouTube. One particular channel stuck out: Steve Ramsey's Woodworking for Mere Mortals. I really liked Steve's down to earth presentation, and his attitude that anyone can do woodworking with basic tools.

In January, I signed up for his online course The Weekend Woodworker. The course contains six projects with a bonus workbench project to build first. Over the past week (I haven't been able to get to it until now due to lousy weather), I built the workbench project. Pictures of the build process are at the bottom of this post.

Years ago, while watching a public television show about artists in North Carolina, a metalwork artist said something about the learning process that really stuck with me. He said that prior to becoming a metalworker, the only difference between metalwork artists and himself was that metalwork artists were actually doing it. That's the attitude I'm taking this year with woodworking; why think about it when you can just do it, learning something in the process? I'm looking forward to tackling the projects in the course, and I've already got plenty of ideas on other projects to build. Stay tuned for more!

Company Man

Jan 28, 2019

I recently stumbled on yet another enjoyable YouTube channel: Company Man. Each video tackles a particular company (or pair of companies), discussing how they got to where they are today. Some of the interesting ones I've seen so far:

New videos are posted each Wednesday.

1985 Fiero Revival

Jan 24, 2019

I'm not a car guy, but tonight I stumbled upon a great little video series (still in progress, as of this writing!) of a guy restoring a 1985 Pontiac Fiero. The car sat unused for 20 years and he's working on bringing it to life. Part 1 of the series is where to start. It's a real pleasure to see this guy's effort paying off.

One of our local news stations recently deployed an anti-adblock package (Admiral) on their website. It detects the presence of adblock software on the client, and prevents access until you white-list the website. The ads shown by this particular website have previously included malicious ones that attempt to deploy malware. As such, I refuse to white-list their site, having had bad experiences in the past.

While searching for tactics to sidestep this, I stumbled upon two Reddit threads (thread 1 and thread 2), both of which gave me enough information to figure out what was going on. The second thread above points to a repo of domain names used by this third-party solution for serving their adblock detection software. There are enough similarities in the domain names they use that make it pretty easy to pick out patterns. A typical pattern they employ is:

  • <adjective><noun>.com

This is similar to how default Docker containers are named. An example is unequalbrake.com, which also happens to be the domain serving the aforementioned news website instance.

Adding this domain (or list of domains) to your adblock filter list should block the adblock blocker.