From 890b34bcc1a6b4073d1e512b1386634f7bc5ea52 Mon Sep 17 00:00:00 2001 From: "Adam T. Carpenter" Date: Wed, 21 Apr 2021 22:57:39 -0400 Subject: unified posts dir, until I can figure out makefile sub-subdirs. makefile auto-generates index --- posts/2019-04-06-why-have-a-website-in-2019.html | 170 ++++++++++ ...-07-how-to-start-and-drive-a-hudson-hornet.html | 322 ++++++++++++++++++ ...est-way-to-transfer-gopro-files-with-linux.html | 127 +++++++ posts/2019-07-04-yabs-yet-another-bad-shop.html | 235 +++++++++++++ ...-21-dancing-the-shag-and-the-new-lion-king.html | 85 +++++ .../2019-07-28-i-finally-found-a-drink-i-like.html | 86 +++++ posts/2019-08-11-marrying-my-best-friend.html | 68 ++++ posts/2019-08-30-keep-right-except-to-pass.html | 108 ++++++ ...9-28-my-preferred-method-for-data-recovery.html | 276 +++++++++++++++ posts/2020-04-10-the-obligatory-covid-19-post.html | 103 ++++++ posts/2020-04-10-wedding-photos-are-here.html | 96 ++++++ posts/2020-07-11-why-computer-science-at-w-m.html | 249 ++++++++++++++ .../2020-07-26-now-this-is-a-minimal-install.html | 101 ++++++ posts/2020-11-30-titanics-last-signals.html | 73 ++++ posts/2020-12-01-the-guides.html | 117 +++++++ posts/2020-12-04-aoc-2020-day-1-in-cbm-basic.html | 231 +++++++++++++ ...int-planning-from-a-certified-scrum-master.html | 203 +++++++++++ ...why-does-everyone-use-adobe-acrobat-reader.html | 144 ++++++++ posts/2020-12-29-antivirus-software-is-a-hack.html | 197 +++++++++++ posts/2021-01-15-adam-s-2020-reading-list.html | 196 +++++++++++ ...n-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html | 375 +++++++++++++++++++++ ...021-01-28-undefined-javasript-is-undefined.html | 163 +++++++++ ...-a-bamf-and-proof-that-organists-are-metal.html | 129 +++++++ ...w-to-automate-certbot-renewal-with-haproxy.html | 256 ++++++++++++++ ...20-how-to-make-your-website-boring-and-why.html | 214 ++++++++++++ .../2019-04-06-why-have-a-website-in-2019.html | 170 ---------- ...why-does-everyone-use-adobe-acrobat-reader.html | 144 -------- .../2020-12-29-antivirus-software-is-a-hack.html | 197 ----------- ...0-how-to-make-your-website-boring-and-why-.html | 214 ------------ .../2020-11-30-titanic's-last-signals.html | 73 ---- ...-21-dancing-the-shag-and-the-new-lion-king.html | 85 ----- .../2019-07-28-i-finally-found-a-drink-i-like.html | 86 ----- posts/life/2019-08-11-marrying-my-best-friend.html | 68 ---- .../2020-04-10-the-obligatory-covid-19-post.html | 103 ------ posts/life/2020-04-10-wedding-photos-are-here.html | 96 ------ .../life/2021-01-15-adam-s-2020-reading-list.html | 196 ----------- ...a-bamf-and-proof-that-organists-are-metal-.html | 129 ------- .../2020-07-11-why-computer-science-at-w-m.html | 249 -------------- .../2020-11-24-i-like-hyper-more-than-actix.html | 23 -- posts/programming/2020-12-01-the-guides.html | 117 ------- .../2020-12-04-aoc-2020-day-1-in-cbm-basic.html | 231 ------------- ...int-planning-from-a-certified-scrum-master.html | 203 ----------- ...21-01-28-undefined-javasript-is-undefined-.html | 163 --------- ...est-way-to-transfer-gopro-files-with-linux.html | 127 ------- ...9-28-my-preferred-method-for-data-recovery.html | 276 --------------- .../2020-07-26-now-this-is-a-minimal-install.html | 101 ------ ...n-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html | 375 --------------------- ...w-to-automate-certbot-renewal-with-haproxy.html | 256 -------------- ...-07-how-to-start-and-drive-a-hudson-hornet.html | 322 ------------------ .../2019-07-04-yabs-yet-another-bad-shop.html | 235 ------------- .../2019-08-30-keep-right-except-to-pass.html | 108 ------ 51 files changed, 4324 insertions(+), 4347 deletions(-) create mode 100644 posts/2019-04-06-why-have-a-website-in-2019.html create mode 100644 posts/2019-06-07-how-to-start-and-drive-a-hudson-hornet.html create mode 100644 posts/2019-07-04-the-best-way-to-transfer-gopro-files-with-linux.html create mode 100644 posts/2019-07-04-yabs-yet-another-bad-shop.html create mode 100644 posts/2019-07-21-dancing-the-shag-and-the-new-lion-king.html create mode 100644 posts/2019-07-28-i-finally-found-a-drink-i-like.html create mode 100644 posts/2019-08-11-marrying-my-best-friend.html create mode 100644 posts/2019-08-30-keep-right-except-to-pass.html create mode 100644 posts/2019-09-28-my-preferred-method-for-data-recovery.html create mode 100644 posts/2020-04-10-the-obligatory-covid-19-post.html create mode 100644 posts/2020-04-10-wedding-photos-are-here.html create mode 100644 posts/2020-07-11-why-computer-science-at-w-m.html create mode 100644 posts/2020-07-26-now-this-is-a-minimal-install.html create mode 100644 posts/2020-11-30-titanics-last-signals.html create mode 100644 posts/2020-12-01-the-guides.html create mode 100644 posts/2020-12-04-aoc-2020-day-1-in-cbm-basic.html create mode 100644 posts/2020-12-08-useful-sprint-planning-from-a-certified-scrum-master.html create mode 100644 posts/2020-12-22-why-does-everyone-use-adobe-acrobat-reader.html create mode 100644 posts/2020-12-29-antivirus-software-is-a-hack.html create mode 100644 posts/2021-01-15-adam-s-2020-reading-list.html create mode 100644 posts/2021-01-15-root-on-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html create mode 100644 posts/2021-01-28-undefined-javasript-is-undefined.html create mode 100644 posts/2021-02-12-louis-vierne-is-a-bamf-and-proof-that-organists-are-metal.html create mode 100644 posts/2021-03-19-how-to-automate-certbot-renewal-with-haproxy.html create mode 100644 posts/2021-04-20-how-to-make-your-website-boring-and-why.html delete mode 100644 posts/computing/2019-04-06-why-have-a-website-in-2019.html delete mode 100644 posts/computing/2020-12-22-why-does-everyone-use-adobe-acrobat-reader.html delete mode 100644 posts/computing/2020-12-29-antivirus-software-is-a-hack.html delete mode 100644 posts/computing/2021-04-20-how-to-make-your-website-boring-and-why-.html delete mode 100644 posts/interesting/2020-11-30-titanic's-last-signals.html delete mode 100644 posts/life/2019-07-21-dancing-the-shag-and-the-new-lion-king.html delete mode 100644 posts/life/2019-07-28-i-finally-found-a-drink-i-like.html delete mode 100644 posts/life/2019-08-11-marrying-my-best-friend.html delete mode 100644 posts/life/2020-04-10-the-obligatory-covid-19-post.html delete mode 100644 posts/life/2020-04-10-wedding-photos-are-here.html delete mode 100644 posts/life/2021-01-15-adam-s-2020-reading-list.html delete mode 100644 posts/life/2021-02-12-louis-vierne-is-a-bamf-and-proof-that-organists-are-metal-.html delete mode 100644 posts/programming/2020-07-11-why-computer-science-at-w-m.html delete mode 100644 posts/programming/2020-11-24-i-like-hyper-more-than-actix.html delete mode 100644 posts/programming/2020-12-01-the-guides.html delete mode 100644 posts/programming/2020-12-04-aoc-2020-day-1-in-cbm-basic.html delete mode 100644 posts/programming/2020-12-08-useful-sprint-planning-from-a-certified-scrum-master.html delete mode 100644 posts/programming/2021-01-28-undefined-javasript-is-undefined-.html delete mode 100644 posts/unix/2019-07-04-the-best-way-to-transfer-gopro-files-with-linux.html delete mode 100644 posts/unix/2019-09-28-my-preferred-method-for-data-recovery.html delete mode 100644 posts/unix/2020-07-26-now-this-is-a-minimal-install.html delete mode 100644 posts/unix/2021-01-15-root-on-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html delete mode 100644 posts/unix/2021-03-19-how-to-automate-certbot-renewal-with-haproxy.html delete mode 100644 posts/wheels/2019-06-07-how-to-start-and-drive-a-hudson-hornet.html delete mode 100644 posts/wheels/2019-07-04-yabs-yet-another-bad-shop.html delete mode 100644 posts/wheels/2019-08-30-keep-right-except-to-pass.html (limited to 'posts') diff --git a/posts/2019-04-06-why-have-a-website-in-2019.html b/posts/2019-04-06-why-have-a-website-in-2019.html new file mode 100644 index 0000000..7fb9b48 --- /dev/null +++ b/posts/2019-04-06-why-have-a-website-in-2019.html @@ -0,0 +1,170 @@ + + + + + + + + + + + + + 53hornet ➙ Why Have a Web Site in 2019? + + + + + +
+

Why Have a Web Site in 2019?

+
+ Adam, why on earth do you have a website? Wait... Is this a + blog? It's 2019, why don't you just use Facebook?! +
+ +

+ I've wanted to have my own website for a long time mostly because I like + playing with technology. I think it's cool that I can make a few files + on a computer in my closet available for the entire world to see. The + web has become a near-necessity in our daily lives and it's only been + around for a couple of decades. That has always fascinated me enough to + drive me to see if I can do it on my own. I started self-hosting my own + web server about a year ago now and it's been an awesome study in the + way all of the tech we use on the web works. +

+ +

+ A written website is also a good way to keep up on my writing skills. + I've graduated college and won't be writing essays for the foreseeable + eternity. Which is fine except that I have no reason to write creatively + or formally anymore. Having this site encourages me to continue turning + thoughts into words, even though it's more casual than a term paper. +

+ +

+ This extends into the professionalism of a personal website. Normally + you can't point your employer towards your Twitter profile as the + distillation of your online footprint. Having a website, especially one + that separates professional and personal interests, is ten times better + than a resume, especially in the world of technology. It lets you tell + people exactly who you are and what you do, without forcing them to + navigate through an auth wall or a bunch of puppy photos. Your + professional and personal lives don't bleed together quite as much and + it makes for a kick-ass business card. +

+ +

+ Most importantly however, I enjoy the level of control that I gain with + creating and operating my own website, something I have also sought for + a long time. In high school I set up an old Dell from my school's + recycling center with Windows XP and Microsoft Internet Information + Services. It didn't have SSL or even a domain name but it was reachable + over the WAN. I set up an upload system so that my friends and I could + 'post' memes and funny messages for each other on raw html pages written + with Microsoft Word. That was the extent of its functionality. It was + slow, insecure, and went offline every time the router got a new IP + assigned to it. But I didn't care. It was a site the school couldn't + block. It had no name and no rules and nobody could tell us what to do + with it because it was ours. And we called it the + Troll Nexus Center because that's what you do when you're 15 +

+ +

+ My reasons then for building the Troll Nexus Center still stand now. + Having your own website is having your own piece of internet + property. + I first heard this wording from + Luke Smith over on his YouTube channel + and it's one-hundred percent true. Tumblogs, Google Sites, Facebook + profiles, and GitHub Pages are all like renting an apartment. Sure, + there are some really nice apartments out there but it's not the same as + owning your own home. You have to pay rent obviously, and rent is + subject to change once your lease is up. If anything breaks you text + your landlord and wait to have it fixed. You aren't allowed to fix it + yourself and sometimes it doesn't get fixed at all. And of course you're + limited by how much you can customize things to your own liking. Whether + it's painting walls or knocking them down. +

+ +

+ These limitations may or may not apply to you. Whether you're paying for + storage, server space, metrics, or watching an ad every five seconds, + these services aren't free either. And you certainly can't fix + everything that goes wrong with them. I started on Google Sites. It's a + truly fantastic system. Building a site is like putting a PowerPoint + slide together. I just plain outgrew it. There were too many things I + wanted to do that I simply couldn't. I was also at the mercy of Google's + constant change. After I finished constructing my first site, Google + announced they would be shutting down the old Google Sites in favor + of an entirely new platform under the same name. Weeks of work got thrown out the window. You might also not care + about ads or customization. You may be intimidated by doing things + yourself and prefer that the landlord take care of everything. + Personally, I like the challenge and the craftsmanship that comes with + doing something myself. And I like being in total control of my server, + site, and content. Not from a tinfoil hat perspective but from a "gosh I + really wish I could just share more than 15 gigabytes of family video + with my relatives in New York and Ohio" perspective. +

+ +

+ So that's why I created my own website. If you want to know + how I host my own website, look for another post about my + server setup where I'll explain everything I'm hosting and how I got it + all hooked up. And that's a wrap. Now you know why I'm here instead of + somewhere else online. Sure, I do have Facebook and YouTube accounts but + I don't frequently update anything on either of them. This site is my + home online. It's where I keep all of my interests, hobbies, and + memories for sharing with others. +

+ +

+ Now you know where to find me. If you want to keep up with me, be + old-fashioned and subscribe to my RSS feed. +

+
+ + diff --git a/posts/2019-06-07-how-to-start-and-drive-a-hudson-hornet.html b/posts/2019-06-07-how-to-start-and-drive-a-hudson-hornet.html new file mode 100644 index 0000000..9224534 --- /dev/null +++ b/posts/2019-06-07-how-to-start-and-drive-a-hudson-hornet.html @@ -0,0 +1,322 @@ + + + + + + + + + + + + + 53hornet ➙ How to Start and Drive a Hudson Hornet + + + + + +
+

How to Start and Drive a Hudson Hornet

+ +

+ My understanding is there are a lot of people out there for whom driving + a car from the mid-20th century is an oddity, a curiosity, or a life + experience they can't relate to. This is for the non-experts, and + non-Hudsonites to get an idea of what it's like. +

+ +

+ There are some significant differences between driving the Hornet and + most other cars you come across today. Some of them are just because + there are sixty-six years between the Hudson and the 2019 model year. + Others are Hudson-specific. Many people who I've talked to have said + that they would feel intimidated driving my car (whether that's because + of its perceived complexity or obvious value to me). So, for those who + just want to know how it's done: here is how you start and drive a + Hudson Hornet. +

+ +

The Gauge Cluster, Switches, and Controls

+ +

+ Open the door, slide onto the bench seat, and sit behind the [massive] + steering wheel. For those who haven't experienced it before, it feels + like you have a whole lot of room at your disposal, almost like there + should be more matter occupying the space around you. In front + of you is probably the shiniest dashboard you've ever seen. It's simple, + and probably slightly familiar. +

+

From left to right above the steering wheel you have:

+ + +

From left to right under the steering wheel you have:

+ + +

+ Also, underneath the dashboard on the left there is a parking brake + handle and hood latch release and on the right there is an arm which + raises and lowers the fresh air cowl vent. Think of it as "recirculate" + in more modern vehicles. If you're looking for the turn signal lever + it's the tiny stick to the left of the steering wheel. The indicator is + the little yellow light on the far left of the dash. There's only one so + it flashes when you're signalling left or right. We also added our own + air conditioning system, something Hudsons never came with from the + factory. +

+ +

Dual-Range Hydramatic

+ +

+ The first thing that might confuse some folks when they first see the + car running is the shift lever. Many Hornets came with three-speed + manual transmissions that were shifted from the column (overdrive was an + option). However, lots of owners paid extra for the optional "Dual-range + Hydramatic", a fully automatic transmission from General Motors. Truly, + this car has a 4-speed automatic that requires no manual shifting during + normal use, making it that much easier to take a boatload of people to + get milkshakes. +

+ +

+ Behind the steering wheel is a shift indicator that deviates from the + "PRNDL" pattern most folks are familiar with. From left to right (shift + arm fully at the top to arm fully towards the bottom), the 'gears' are: +

+ + +

+ Neutral isn't just a mid-way point between reverse and drive in this + car. It's a necessity. With automatic Hornets (and Hydramatics in + general), neutral is used to start the car. There is an electric lockout + preventing the car from being started in any gear but neutral, so you do + have to put the car in neutral before you turn the key (if you're on a + hill put your foot on the brake or engage the parking brake). +

+ +

+ Drive is split into 4-Dr and 3-Dr, which basically decides whether the + transmission utilizes high gear. In the owner's manual, Hudson + recommends using 3-Dr for driving around town (as the low RPMs delivered + by high gear means unnecessary shifting in and out of 4th gear) and 4-Dr + for highway driving. It really depends on what speed you're going to be + driving at but there isn't anything wrong with driving around in 4 all + the time. I typically leave it in 4th at sustained speeds above 45MPH. + You can switch between these gears any time while moving. +

+ +

+ Low gear basically locks the transmission in 2nd gear so you don't spin + the wheels. The owner's manual says this is for pulling out of sand or + dirt if you get stuck. +

+ +

+ Reverse works just about how you might expect but with an added catch: + if the engine is off it acts as park. That's right. When you turn the + car off you can put it in reverse and the transmission will engage a + lock pin to prevent the car from rolling. You can't start the car in + this gear because of the lockout however so you have to shift into + neutral to start the car. So for starting, put it in neutral, for + stopping, put it in reverse. +

+ +

Choke and Gas

+ +

+ For cold starts, our Hornet (and I believe this was common for other + Hudsons of the time) is equipped with an automatic 2-stage choke. Push + the pedal all the way to the floor once to set the choke. After the car + has started and has warmed up, kick the gas quickly to the floor and + release to cancel the choke. +

+ +

+ For warm starts the engine doesn't need the choke but likes to be given + just a little bit of gas while cranking. +

+ +

The Keys, Ignition, and Warning Lights

+ +

+ Hudsons like mine come with two keys. The octagonal one is for starting + the car, it's used in the ignition. The round one is used for the door + and trunk locks (and I believe in my case the glove box). My + understanding is this is actually reversed from the majority of Hudsons + and is due to a locksmith error at one point or another. +

+ +

+ The ignition switch sits so that the teeth of the key enter vertically. + Turning the key left powers accessories like the radio. Turning the key + right once switches the car to "ON" which will allow the engine to be + started and remain running. +

+ +

+ Here's where some things may vary depending on the year of the car. For + '51 Hornets, there's a separate starter button located all the way on + the left control pod. For these cars, you put the key in and turn it to + "ON", and then press and hold the button until the car has started up. + For '52 Hornets onwards, the ignition switch also activates the starter + if you turn the key past "ON" (like in most modern vehicles). +

+ +

+ If you turn the key to "ON" you'll see two red warning lights appear on + the dash next to the indicators marked "AMP" and "OIL". These are + [alternator] charging status and oil pressure status lights. Our car is + equipped with a 12-V alternator system so the AMP light really comes on + if there is low voltage while the oil pressure light comes on when + there's low oil pressure. These lights will only appear with engine off, + key "ON" or if something has gone very wrong. +

+ +

Starting and Driving

+ +

+ So now that I've gone over the basics of all the components, here is the + normal starting procedure. It actually varies depending on whether the + engine has been warmed up. That's life with carburetors. +

+ +

From cold:

+ + + +

From warm:

+ + + +

Stopping and Parking

+ + + +

+ Note: I usually engage the parking brake AND put the car in reverse, + just to be safe. If you had to pick one however I would use the + transmission in case you're on a steep hill and your brakes fail for + whatever reason. +

+ +

+ And there you have it! Not much is different from most cars around today + but there are one or two quirks (more about old cars than about Hudsons + in particular). The only major thing to keep track of while driving is + that you have no power steering, so get ready to anticipate turns sooner + and use more of the wheel with every turn. +

+
+ + diff --git a/posts/2019-07-04-the-best-way-to-transfer-gopro-files-with-linux.html b/posts/2019-07-04-the-best-way-to-transfer-gopro-files-with-linux.html new file mode 100644 index 0000000..bbe5b28 --- /dev/null +++ b/posts/2019-07-04-the-best-way-to-transfer-gopro-files-with-linux.html @@ -0,0 +1,127 @@ + + + + + + + + + + + + + 53hornet ➙ Offloading GoPro Footage the Easy Way! + + + + + +
+

Offloading GoPro Footage the Easy Way!

+ +

+ Transferring files off of most cameras to a Linux computer isn't all + that difficult. The exception is my GoPro Hero 4 Black. For 4th of July + week I took a bunch of video with the GoPro, approximately 20 MP4 files, + about 3GB each. The annoying thing about the GoPro's USB interface is + you need additional software to download everything through the cable. + The camera doesn't just show up as a USB filesystem that you can mount. + The GoPro does have a micro-SD card but I was away from home and didn't + have any dongles or adapters. Both of these solutions also mean taking + the camera out of its waterproof case and off of its mount. So here's + what I did. +

+ +

+ GoPro cameras, after the Hero 3, can open up an ad-hoc wireless network + that lets you browse the GoPro's onboard files through an HTTP server. + This means you can open your browser and scroll through the files on the + camera at an intranet address, 10.5.5.9, and download them + one by one by clicking every link on every page. If you have a lot of + footage on there it kinda sucks. So, I opened up the manual for + wget. I'm sure you could get really fancy with some of the + options but the only thing I cared about was downloading every single + MP4 video off of the camera, automatically. I did not want to download + any of the small video formats or actual HTML files. Here's what I used: +

+ +
+        
+sh wget --recursive --accept "*.MP4" http://10.5.5.9:8080/
+		
+      
+ +

+ This tells wget to download all of the files at the GoPro's + address recursively and skips any that don't have the MP4 extension. Now + I've got a directory tree with all of my videos in it. And the best part + is I didn't have to install the dinky GoPro app on my laptop. Hopefully + this helps if you're looking for an easy way to migrate lots of footage + without manually clicking through the web interface or installing + additional software. The only downside is if you're moving a whole lot + of footage, it's not nearly as quick as just moving files off the SD + card. So I'd shoot for using the adapter to read off the card first and + only use this if that's not an option, such as when the camera is + mounted and you don't want to move it. +

+ +

Some things I would like to change/add:

+ + + +

+ I could probably write a quick and dirty shell script to do all of this + for me but I use the camera so infrequently that it's probably not even + worth it. +

+
+ + diff --git a/posts/2019-07-04-yabs-yet-another-bad-shop.html b/posts/2019-07-04-yabs-yet-another-bad-shop.html new file mode 100644 index 0000000..b0707e1 --- /dev/null +++ b/posts/2019-07-04-yabs-yet-another-bad-shop.html @@ -0,0 +1,235 @@ + + + + + + + + + + + + + 53hornet ➙ YABS: Yet Another Bad Shop + + + + + +
+

YABS: Yet Another Bad Shop

+

+ Today I received a text message from a local mechanic/auto shop asking + me to leave them a Google review. It was an automated message from a + shop that I know well and have used many times in the past. + Unfortunately, I have had several poor experiences (at the time they + seemed horrific) with them in the past year and I can honestly say + they'll never receive my business again. Now I could have used this as + an opportunity to leave them an anonymous nasty-gram but instead I'm + going to do the opposite. I'm going to write about everything I don't + like about them without telling you who they are or hiding who I am. Why + would I do that? Well for one, they were an excellent shop for many + years. I believe a recent change in management is to blame and I'm not + going to ruin their chances of making a comeback (because frankly I + would like for them to rebound). And secondly, I don't believe in + hiding. This page and its author are public knowledge. Now, in no + particular order: a sample of awful work from yet another bad shop. +

+ +

Mom's Truck -- Balls Out

+ +

+ Mom's truck is a 2007 Chrysler Aspen that she loves very much. Dad does + a whole lot of work on it himself (the both of us do pretty much + everything we can in-house so long as we have the right equipment). + We've been taking her truck into this shop for years because we've found + them to be reliable, efficient, and economical. As I said before, at + some point in their recent history they changed hands -- either + ownership or management, I can't remember which. It was around this time + that Dad decided to overhaul Mom's front suspension. He replaced the + ball joints, tie rod ends, and a few other worn out parts. He then did + his own best-guess front-end alignment, but left everything loose so + that YABS could finish up the alignment and tighten everything. Now read + that again because it's important. Dad did his own alignment in our + driveway (as a cost-saving measure), got it decently close, but then + instructed this shop to finish the job and tighten everything up. +

+ +

+ Now here's where things fall apart. This shop full of professional + mechanics took one look at the alignment Dad did and decided it was good + enough. Hooray for Dad and supernatural mechanical skills, but the shop + didn't even touch the car. They called Dad back to come pick up the car, + telling him it was already good to go. They never tightened a thing, + even after Dad explicitly told them everything was loose and needed to + be tightened but they didn't to touch a thing. So what happened? Dad + picked up the car assuming everything was A-OK and Mom drove the car for + about a week before the two front tires wore down so badly they had to + be replaced immediately. Everything fell out of alignment as things + loosened further and further and the tires wore unevenly until they + ripped themselves to shreds. The worst part? These weren't tires with 6+ + years on them. These were brand new tires. So YABS got to install two + more front tires and then tighten everything. They did not cover the + costs, presumably because it was Dad who had done the alignment. Strike + one. +

+ +

Friend's Minivan -- Crude Necessities

+ +

+ A good friend of ours drives a 2005-2006 Chrysler Town and Country. It + was actually Mom's car before upgrading to the Aspen (the minivan was + perfect in every way but it couldn't tow). Our friend has been using + YABS for just a long as we have. Once again, things started getting + kinda strange after several years of good service. She started getting + charged extra for simple repairs she had them doing very consistently. + They also started tacking on extra items for routine jobs. She would go + in for an inspection and they would claim she needed a new Part X. Now + this in and of itself isn't an uncommon or even strange request to make. + As cars age they need things and sometimes you don't know what they need + until you visit a professional mechanic. They remember the things you + forget about. +

+ +

+ One day they did all the forgetting, and they forgot a pretty important, + nay, crucial engine component: motor oil. Our friend took her minivan + into YABS for a routine oil change. Good diligence on her part. And + she's not the type to do that change on her own. She's too old to get + under a car anyway (no offense!). So she took the van to YABS and they + did a job they've done thousands of times: drain oil, replaced the + filter, and gave her back the car. Easy peasy right? Now I know I'm not + a professional but I'm thinking someone might have wanted to + double-check that several quarts of synthetic had left the shop shelf + and gone into the car they just backed out of the bay door. Now this + part of the story I'm a little fuzzy on so take it with a large, heaping + grain of salt, but I can say for a fact that they failed to + completely refill the engine oil before returning her car. + Supposedly there was enough in there such that the minivan survived long + enough for them to realize it before she drove off. +

+ +

Monty, My 2013 Ford Focus -- Nut Allergy

+ +

+ I decided to give YABS another try after a long leave of absence. I + needed new tires all around for my daily driver. I also needed an + inspection and an alignment. A simple set of tasks for any shop (you see + where this is going). I initially tried to go to another local shop but + they were all out of the tires I was looking to get so I caved and went + to YABS. About halfway through the job they gave me a call and told me + they had some bad news. They said that there were some issues getting + the lug nuts off my wheels and that they had all been stripped, warped, + or otherwise destroyed in the process. They told me the only fix was to + get new ones from a supplier in town for about $160. Keep in mind the + entire job (inspection, tires, etc.) was going to cost $650. + Furthermore, dad and I had no problem getting those lug nuts off and + back on again just a few weeks prior when we changed the transmission + fluid. +

+ +

+ They didn't have an explanation that I could reconcile with. Joe Schmo + over the phone told me this is typical of Fords and Chryslers these days + and that they'd like to keep my lug nuts for a class action lawsuit + they're participating in. Now why on Earth would any sane mechanic, with + full knowledge they are dealing with a defective set of lug nuts, take a + high power impact wrench to those wheels without speaking with the owner + about it first? Smelled fishy to me honestly. But what was I gonna do? + Dad went out and grabbed twenty new lug nuts for cheaper than they + wanted to sell them for. +

+ +

+ Oh the tires were Cooper GTs by the way and they're amazing. They're + smooth and quiet and came with a very nice warranty. They're also made + in the USA, which is very important to me. 10/10 would recommend. +

+ +

Ol' Blue -- Tunnel Vision

+ +

+ This was the real kicker. And this one doesn't really have any trailing + narrative. I got four new tires on Ol' Blue, my 1953 Hudson Hornet. They + were delivered to our house: four brand new Diamond Back wide white wall + radials. Super nice tires, with a super nice road hazard warranty (as a + side note I totally recommend you + check out Diamond Back's website if + you're looking for white wall radials). So we brought the car to YABS + with the new tires and asked them to mount them on the car. +

+ +

+ When we went to pick up the car everything looked great and I drove off. + I made it all the way to the Monitor Merrimack Memorial Bridge Tunnel + before I heard a loud rattling and a bang. I looked in the rear-view + mirror and swore I could see my precious hubcap rolling off to eternity. + When they replaced the hubcaps they didn't fully press one of them on. + And it's not that difficult. These hub caps are very secure when pressed + on the rim, we've never had problems with them. Oh and we're talking + about Hudson hubcaps that came with the car, and aren't super easy to + find. And I couldn't stop to get out and grab it because I was right at + the mouth of the tunnel. We went back later to try and see it but we + couldn't. And it was probably destroyed getting thrown from the car + anyways. +

+ +

+ The worst part is, the hubcap took a chunk out of my white wall on its + way out from under the wheel skirt. So the day I got the tires I had to + take a picture and redeem my road hazard warranty. Luckily, Diamond Back + were true to their word and sent me a new one no questions asked. The + beat up tire is now my spare. +

+ +

Not All Bad

+ +

+ Like I said before, YABS used to be a very nice shop with friendly + people that did good work. And they didn't charge exorbitant prices for + their work. Times have changed, and I believe management has as well. + I've stopped visiting their shop completely. I found a new one that I + trust and will be taking all of my cars to. They've already done a + safety inspection on Ol' Blue and didn't put up a fuss. They're clean + and friendly and don't seem to be out to screw me. But as with + everything else, your mileage may vary. +

+
+ + diff --git a/posts/2019-07-21-dancing-the-shag-and-the-new-lion-king.html b/posts/2019-07-21-dancing-the-shag-and-the-new-lion-king.html new file mode 100644 index 0000000..b8deca5 --- /dev/null +++ b/posts/2019-07-21-dancing-the-shag-and-the-new-lion-king.html @@ -0,0 +1,85 @@ + + + + + + + + + + + + + 53hornet ➙ Dancing the Shag & Two Left Feet + + + + + +
+

Dancing the Shag & Two Left Feet

+

+ Not all of my posts are huge, and they probably shouldn't be. Amy and I + had a really great time yesterday at Two Left Feet Dance Studio, + learning more about how to dance the Carolina Shag in preparation for + our wedding (which is in less than 20 days)! An enormous swing band is + going to play all of our favorites from the brass band/swing era, and + one of the easiest dances to do to that music is the Shag. I wrote a + paper on the Shag a few years ago for school but never actually learned + how to do it. The steps are simple for us to remember and it's easy + enough to add flair or mix it up so we look like we know what we're + doing during our first dance. +

+ +

+ We also got out to see the new Lion King remake and I can honestly say + it was worth it. If anyone's a Lion King purist, it's Amy. It's easily + been her favorite movie since she was a toddler, and to see it + tastefully redone almost 25 years after it was first released was + thoroughly enjoyable. There were minor alterations to literal sentences + in the script that all added some context to things that were always + kind of assumed in the original (clarification on Scar's backstory, + etc.). I did however feel like they were trying to throw Beyonce lines + the way a middle-schooler tries to turn a 500-word paper into a 700-word + paper. Regardless, it's definitely re-living the classic, not re-hashing + it. +

+
+ + diff --git a/posts/2019-07-28-i-finally-found-a-drink-i-like.html b/posts/2019-07-28-i-finally-found-a-drink-i-like.html new file mode 100644 index 0000000..6edd6ef --- /dev/null +++ b/posts/2019-07-28-i-finally-found-a-drink-i-like.html @@ -0,0 +1,86 @@ + + + + + + + + + + + + + 53hornet ➙ Finally Found a Drink I Like + + + + + +
+

Finally Found a Drink I Like

+

+ Anyone who knows me even slightly well probably knows that I don't + drink. And it's not out of moral obligation or anything like that. I + just plain can't stand the taste of alcohol. So it's no surprise that my + entire family has been trying to throw different alcoholic beverages in + my direction to see what sticks. +

+ +

+ But it finally happened! I finally found a drink with alcohol in it. And + not only did I not gag, but I genuinely enjoy it, think it tastes great, + and mix it myself. +

+ +

+ It's called Blackberry Cream Soda. It's just blackberries, + ginger ale, and spiced rum. It's darn good. And it's going to be the + signature drink at our wedding, whatever that means. All I know is I can + finally order something at a bar and that's cool by me. +

+ +

+ Behold, Blackberry Cream Soda +

+
+ + diff --git a/posts/2019-08-11-marrying-my-best-friend.html b/posts/2019-08-11-marrying-my-best-friend.html new file mode 100644 index 0000000..9ac1153 --- /dev/null +++ b/posts/2019-08-11-marrying-my-best-friend.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + + 53hornet ➙ I Married My Best Friend! + + + + + +
+

I Married My Best Friend!

+

+ It was an inexplicable mixture of joy and butterflies getting to marry + my best friend. It was truly like a dream come true, so much so that it + drove me to tears multiple times. Now that we're on our honeymoon, it + feels simultaneously like everything and nothing has changed but I think + that's a good thing. +

+ +

More to come!

+
+ + diff --git a/posts/2019-08-30-keep-right-except-to-pass.html b/posts/2019-08-30-keep-right-except-to-pass.html new file mode 100644 index 0000000..8fe960c --- /dev/null +++ b/posts/2019-08-30-keep-right-except-to-pass.html @@ -0,0 +1,108 @@ + + + + + + + + + + + + + 53hornet ➙ Left Lane is for Passing, Not Cruising + + + + + +
+

Left Lane is for Passing, Not Cruising

+ +

+ Greetings fellow drivers of Hampton Roads. You may have noticed a new + sign on I264 today that befuddled or confused you. It went something + along the lines of +

+ +
LEFT LANE IS FOR PASSING NOT CRUISING
+ +

+ Believe it or not this has been the law throughout Virginia for years + (read about it here + and + here). The law states you keep right except while passing. In most other + states things work this way but in Virginia, especially around here, the + left lane is treated as a moving, cruising lane. If you're in the left + lane and you've completed a pass please be mindful of the cars behind + you and move back over into the right-hand lane(s) so that other drivers + can do the same. +

+ +

+ It's really nice when this is practiced (like I said, I've experienced + it in other states) because you can easily move over when there are slow + vehicles ahead and then continue on your merry way. It reduces + congestion and prevents people from having to pass in the right lane, + which is both annoying and dangerous. Especially since this is typically + the lane cars from entrance and exit ramps are merging with. +

+ +

+ Don't forget too that it isn't rude or road-rage-y for someone behind + you to honk their horn or flash their lights if you're moving too slowly + in the passing lane. This is a perfectly polite request to pass you. You + don't set or enforce the speed limit. The correct (and legal) thing to + do, believe it or not, is to move over and slow down to let them pass + you. It's all about safe and sane driving etiquette. If you aren't + actively passing other cars, move on over to the right. It goes a long + way. +

+
+ + diff --git a/posts/2019-09-28-my-preferred-method-for-data-recovery.html b/posts/2019-09-28-my-preferred-method-for-data-recovery.html new file mode 100644 index 0000000..9751eda --- /dev/null +++ b/posts/2019-09-28-my-preferred-method-for-data-recovery.html @@ -0,0 +1,276 @@ + + + + + + + + + + + + + 53hornet ➙ How I Do Data Recovery + + + + + +
+

How I Do Data Recovery

+ +

+ This week Amy plugged in her flash drive to discover that there were no + files on it. Weeks before there had been dozens of large cuts of footage + that she needed to edit down for work. Hours of recordings were + seemingly gone. And the most annoying part was the drive had worked + perfectly on several other occasions. Just not now that the footage was + actually needed of course. Initially it looked like everything had been + wiped clean, however both Amy's Mac and her PC thought the drive was + half full. It's overall capacity was 64GB but it showed only about 36GB + free. So there still had to be data on there if we could find the right + tool to salvage it. +

+ +

+ Luckily this wasn't the first time I had to recover accidentally (or + magically) deleted files. I had previously done so with some success at + my tech support job, for some college friends, and for my in-laws' + retired laptops. So I had a pretty clear idea of what to expect. The + only trick was finding a tool that knew what files it was looking for. + The camera that took the video clips was a Sony and apparently they + record into m2ts files, which are kind of a unique format + in that they only show up on Blu-Ray discs and Sony camcorders. Enter my + favorite two tools for dealing with potentially-destroyed data: + ddrescue and photorec. +

+ +

DDRescue

+ +

+ ddrescue is a godsend of a tool. If you've ever used + dd before, forget about it. Use ddrescue. You + might as well alias dd=ddrescue because it's that great. By + default it has a plethora of additional options, displays the progress + as it works, recovers and retries in the event of I/O errors, and does + everything that good old dd can do. It's particularly good + at protecting partitions or disks that have been corrupted or damaged by + rescuing undamaged portions first. Oh, and have you ever had to cancel a + dd operation? Did I mention that ddrescue can + pause and resume operations? It's that good. +

+ +

PhotoRec

+ +

+ photorec is probably the best missing file recovery tool + I've ever used in my entire life. And I've used quite a few. I've never + had as good results as I've had with photorec with other + tools like Recuva et. al. And photorec isn't just for + photos, it can recover documents (a la Office suite), music, images, + config files, and videos (including the very odd + m2ts format!). The other nice thing is + photorec will work on just about any source. It's also free + software which makes me wonder why there are like $50 recovery tools for + Windows that look super sketchy. +

+ +

In Practice

+ +

+ So here's what I did to get Amy's files back. Luckily she didn't write + anything out to the drive afterward so the chances (I thought) were + pretty good that I would get something back. The first thing I + always do is make a full image of whatever media I'm trying to recover + from. I do this for a couple of reasons. First of all it's a backup. If + something goes wrong during recovery I don't have to worry about the + original, fragile media being damaged or wiped. Furthermore, I can work + with multiple copies at a time. If it's a large image that means + multiple tools or even multiple PCs can work on it at once. It's also + just plain faster working off a disk image than a measly flash drive. So + I used ddrescue to make an image of Amy's drive. +

+ +

+$ sudo ddrescue /dev/sdb1 amy-lexar.dd
+GNU ddrescue 1.24
+Press Ctrl-C to interrupt
+     ipos:   54198 kB, non-trimmed:        0 B,  current rate:   7864 kB/s
+     opos:   54198 kB, non-scraped:        0 B,  average rate:  18066 kB/s
+non-tried:   63967 MB,  bad-sector:        0 B,    error rate:       0 B/s
+  rescued:   54198 kB,   bad areas:        0,        run time:          2s
+pct rescued:    0.08%, read errors:        0,  remaining time:         59m
+                              time since last successful read:         n/a
+Copying non-tried blocks... Pass 1 (forwards)
+	  
+ +

+ The result was a very large partition image that I could fearlessly play + around with. +

+ +
+		
+$ ll amy-lexar.dd
+-rw-r--r-- 1 root root 60G Sep 24 02:45 amy-lexar.dd
+        
+	  
+ +

+ Then I could run photorec on the image. This brings up a + TUI with all of the listed media that I can try and recover from. +

+ +

+$ sudo photorec amy-lexar.dd
+
+PhotoRec 7.0, Data Recovery Utility, April 2015
+http://www.cgsecurity.org
+
+  PhotoRec is free software, and
+comes with ABSOLUTELY NO WARRANTY.
+
+Select a media (use Arrow keys, then press Enter):
+>Disk amy-lexar.dd - 64 GB / 59 GiB (RO)
+
+>[Proceed ]  [  Quit  ]
+
+Note:
+Disk capacity must be correctly detected for a successful recovery.
+If a disk listed above has incorrect size, check HD jumper settings, BIOS
+detection, and install the latest OS patches and disk drivers.
+	  
+ +

+ After hitting proceed photorec asks if you want to scan + just a particular partition or the whole disk (if you made a whole disk + image). I can usually get away with just selecting the partition I know + the files are on and starting a search. +

+ +

+PhotoRec 7.0, Data Recovery Utility, April 2015
+http://www.cgsecurity.org
+
+Disk amy-lexar.dd - 64 GB / 59 GiB (RO)
+
+     Partition                  Start        End    Size in sectors
+      Unknown                  0   0  1  7783 139  4  125042656 [Whole disk]
+>   P FAT32                    0   0  1  7783 139  4  125042656 [NO NAME]
+
+>[ Search ]  [Options ]  [File Opt]  [  Quit  ]
+                              Start file recovery
+	  
+ +

+ Then photorec asks a couple of questions about the + formatting of the media. It can usually figure them out all by itself so + I just use the default options unless it's way out in left field. +

+ +

+PhotoRec 7.0, Data Recovery Utility, April 2015
+http://www.cgsecurity.org
+
+   P FAT32                    0   0  1  7783 139  4  125042656 [NO NAME]
+
+To recover lost files, PhotoRec need to know the filesystem type where the
+file were stored:
+ [ ext2/ext3 ] ext2/ext3/ext4 filesystem
+>[ Other     ] FAT/NTFS/HFS+/ReiserFS/...
+	  
+ +

+ Now this menu is where I don't just go with the default path. + photorec will offer to search just unallocated space or the + entire partition. I always go for the whole partition here; sometimes + I'll get back files that I didn't really care about but more often than + not I end up rescuing more data this way. In this scenario searching + just unallocated space found no files at all. So I told + photorec to search everything. +

+ +

+PhotoRec 7.0, Data Recovery Utility, April 2015
+http://www.cgsecurity.org
+
+   P FAT32                    0   0  1  7783 139  4  125042656 [NO NAME]
+
+
+Please choose if all space need to be analysed:
+ [   Free    ] Scan for file from FAT32 unallocated space only
+>[   Whole   ] Extract files from whole partition
+	  
+ +

+ Now it'll ask where you want to save any files it finds. I threw them + all into a directory under home that I could zip up and send to Amy's + Mac later. +

+ +

+PhotoRec 7.0, Data Recovery Utility, April 2015
+
+Please select a destination to save the recovered files.
+Do not choose to write the files to the same partition they were stored on.
+Keys: Arrow keys to select another directory
+      C when the destination is correct
+      Q to quit
+Directory /home/adam
+ drwx------  1000  1000      4096 28-Sep-2019 12:10 .
+ drwxr-xr-x     0     0      4096 26-Jan-2019 15:32 ..
+>drwxr-xr-x  1000  1000      4096 28-Sep-2019 12:10 amy-lexar-recovery
+	  
+ +

+ And then just press C. photrec will start + copying all of the files it finds into that directory. It reports what + kinds of files it found and how many it was able to locate. I was able + to recover all of Amy's lost footage this way, past, along with some + straggler files that had been on the drive at one point. This has worked + for me many times in the past, both on newer devices like flash drives + and on super old, sketchy IDE hard drives. I probably won't ever pay for + data recovery unless a drive has been physically damaged in some way. In + other words, this software works great for me and I don't foresee the + need for anything else out there. It's simple to use and is typically + pretty reliable. +

+
+ + diff --git a/posts/2020-04-10-the-obligatory-covid-19-post.html b/posts/2020-04-10-the-obligatory-covid-19-post.html new file mode 100644 index 0000000..44f6fd0 --- /dev/null +++ b/posts/2020-04-10-the-obligatory-covid-19-post.html @@ -0,0 +1,103 @@ + + + + + + + + + + + + + 53hornet ➙ Obligatory COVID-19 Post + + + + + +
+

Obligatory COVID-19 Post

+

+ We're alive! All three of us: Amy, Clementine, and myself. We're doing + what we do best and that is being hermits with zero social contact. + That's pretty okay by us though because it lets us slow down from all + the fast-paced life changes we've made in the past few months. +

+ +

+ In January Amy and I bought a house! We couldn't have done it without + the wonderful help of everyone who gave us wedding gifts. We got a nice + little standalone place in Suffolk, much closer to where I work and + centrally located for Amy's tutoring business. We spent all of January + painting and prepping for the big move. Late January and early February + were all moving and unpacking and trying to get back in the groove. + Since the outbreak, we've been using the extra time at home to finish up + all the move-in projects we wanted to: finishing painting, putting up + shelves, hanging pictures, and rewiring electrical outlets. +

+ +

+ Amy also finally got the chance to pursue her dream job: she started up + her own private tutoring business. She's been working hard with clients + all over Hampton Roads, from college students all the way to + first-graders. Business was booming before schools closed but I know + she'll bring it back once things have returned to normal again. No + worries though, she's spending this time helping William and Mary handle + remote operations and students in need. She's also [supposed to be] + writing her master's thesis so she can graduate in May but you know how + it is. +

+ +

+ We're also working through a family illness, which adds difficulty . We + expect a speedy recovery though and we're really excited for that. + All-in-all, we're really enjoying our lives as a happily married couple. + It's been about eight months now and I've enjoyed every minute of it: + the glad, the slightly stressed, and the overarching worry as the world + took a strange turn. But we're looking forward to a good Summer now. The + weather has turned nice -- really nice -- and Clementine is forcing us + to get outside. She's in love with her nice, big fenced-in yard and + refuses to come in after catching hoops most of the time. +

+ +

Stay safe, smart, and sane!

+
+ + diff --git a/posts/2020-04-10-wedding-photos-are-here.html b/posts/2020-04-10-wedding-photos-are-here.html new file mode 100644 index 0000000..20b5ccd --- /dev/null +++ b/posts/2020-04-10-wedding-photos-are-here.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + 53hornet ➙ Wedding Photo Debacle + + + + + +
+

Wedding Photo Debacle

+ +

+ At long last we have all of our wedding photos together! Unfortunately a + large portion of the professional ones were lost during editing but + we're extremely fortunate to everyone who took pictures throughout the + festivities so we have more to share! We hope you enjoy flipping through + them as much as we did! There is also a collection of the photos we took + while we were on our honeymoon on Mackinac Island, MI. It was an + absolutely magical place and truly the experience of a lifetime for us + to run away there. We're in contact with our videographer, who's working + on the final cut now. +

+ +

+ Everything is available at the links down below. You can scroll through + the photos, view them in fullscreen, and even download them or share + them elsewhere. We hope you have as much fun flipping through them as we + did! +

+ + +
+ + diff --git a/posts/2020-07-11-why-computer-science-at-w-m.html b/posts/2020-07-11-why-computer-science-at-w-m.html new file mode 100644 index 0000000..8933bcf --- /dev/null +++ b/posts/2020-07-11-why-computer-science-at-w-m.html @@ -0,0 +1,249 @@ + + + + + + + + + + + + + 53hornet ➙ Why Computer Science at William and Mary + + + + + +
+

Why Computer Science at William and Mary

+ +

+ Recently a rising high-school senior asked for input on what going to + the College of William and Mary was like for a Computer Science degree. + They were asking about the program itself as well as what it's like on + and off campus. Here's what I sent to them. +

+ +

Quick Intro

+ +

+ I graduated with a Bachelor's in Computer Science from W&M in 2018. + I'm a couple years in the workforce now but can still remember my + experiences well enough to hopefully add my honest opinion on my time + there as well as how it prepared me for my career. I will also add a + little bit about my time on campus in a dorm and off-campus in Colonial + Williamsburg. +

+ +

Courses and Curriculum

+ +

+ I felt very positively about the array of courses that were offered + while I was a student. I took a variety of core prerequisites, just like + everyone else, and a good mix of electives. The courses I took include + Data Structures and Algorithms, Software Development/Engineering, + Computer Organization/Architecture, UNIX Systems Programming, Computer + Graphics/Animation, and Computer and Network Security. This list is not + exhaustive and I'm sure they aren't all offered anymore. I was also + required to take a few math classes (Calc I, II, Discrete Math, Linear + Algebra, and Finite Automata). +

+ +

+ It is true that the courses listed at cs.wm.edu aren't all + offered at the same time. And it is also true that the higher-level + electives pretty much all required my core prerequisites to be + completed. The result is that the electives all came in my final two + years. My understanding is the curriculum is designed to give someone + the best possible background in computing as a whole. A lot of the + topics may seem like they would never be useful in the "real world" but + I have found the opposite is true. I am an application developer at a + three-letter company. My day-to-day work is building and debugging web + apps, but there's been a lot more to it than that. My first assignment + on the job was scraping bytes off a remote shell and writing a parser to + sift through them. The level of understanding I gathered from my core + classes helped more than I expected they would. I think as a whole they + give me an edge at work and help me teach my colleagues about + algorithms, performance, and systems administration. +

+ +

+ That being said, course registration was always nightmarish. It was very + difficult to get into the limited seats in the classes I was most + interested in. Eventually the heads of the department had to pass around + a sign up sheet and organize every student into courses, classrooms, and + professors so that seniors would graduate on time and we could all get + something on our schedules. I hope the shortage of teachers has + caught up since I graduated. I learned from a long-time faculty member + that this is largely a result of the exponential growth of incoming CS + degree-seekers. The program has grown very popular in the last ten years + and I like to think grads are catching on to that. +

+ +

Teaching

+ +

+ CS@W&M had neutral to good instructors for me. Some were far worse + than others, as with all subjects. When I was there, lots of the older + faculty were retiring and quickly being replaced with younger, newer + instructors, which added to the growing pains of the program. The most + important thing again was making sure there were enough teachers to + teach all of the students. +

+ +

+ I know a few of my peers were very upset about what they described as a + lack of communication or availability from their professors. Some have + also mentioned they didn't like having to learn material on their own + and wanted more to come from instruction. I don't deny that the material + itself was difficult and there was a lot of hard work I had to do on my + own to understand very involved concepts in intense, fast-paced courses. + I think that hard work has paid off. I don't think there's realistically + anywhere someone can learn about computing where they won't do any + learning on their own. I am also a very visual, and hands-on learner so + I suppose your mileage may vary. +

+ +

+ The most important takeaway from this for me was the ability to pick up + new concepts and technologies quickly and apply them productively. The + majority of professors had project-driven courses. Lots of due dates + meant learning how to transform what I read or learned in class into + practical applications in short amounts of time. This has become, + according to those I work with, one of my greater assets. I am + constantly learning new things in my career and I don't have a lecturer + to explain things to me. It's very powerful to have that and I am + thankful for it. It also helps me teach that knowledge to my colleagues + so we can move faster as a team. +

+ +

Campus

+ +

+ I agree with my peers about the conditions of classrooms and buildings + on campus. Some are old. I guess that comes with an old university but + there are a choice few that haven't been kept up as best they could. + Since CS is growing so fast it's also long outgrown its own offices. + Classrooms are scattered throughout every academic building on campus + and I probably had a CS course in at least 80% of them. That meant + jumping from one side of campus to another and back again in between + periods. +

+ +

+ The College itself isn't too sprawling. I am long-legged and I found I + could get from one end of campus to another in fifteen minutes on foot. + I rode bike a lot to get to classes where I only had ten minutes to do + it. It's also pretty marshy and woodsy in a lot of areas, so during the + rainy season some walking paths got muddy or flooded. Good boots + required. I have never been in as good shape as when I had to do all + that walking but I definitely got soaked and winded making those + transitions. +

+ +

+ I appreciate history and architecture and was drawn in by the look and + feel of William and Mary as a result. Without getting too romantic, it's + definitely a beautiful place to attend classes. The ancient Wren + building still holds classes and it's a monument to the College's + tradition. However, I really appreciated the modern academic buildings + on the other side of campus where all of the new construction was taking + place. Modern lab equipment and the library lived there. +

+ +

+ The dorms were nothing to write home about. Lots of them were nested in + the woods and built ages ago so they were a little tired and even dingy. + Others are brand new and well maintained; ask around and get opinions on + which ones to go for first chance you get. I made do with what I got for + the first couple of years by keeping it clean and decorated. My last two + years I lived in a couple of off-campus apartments. It was well worth + the switch. Depending on where you are on campus you may need at least a + bike to access local restaurants, shops, and the grocery store. A bike + is a good idea anyway but it's not necessary for every dorm. +

+ +

Colonial Williamsburg

+ +

+ Lots of my peers didn't appreciate CW as a "college town" but I enjoyed + my time there. I can't speak about parties or clubbing, I was boring and + didn't do any of that. I made a great group of friends and we would walk + into town to get ice cream, see historical attractions (most of which + are free as a student, IIRC), and see movies or plays when we weren't + studying or playing video games in the dorm. There are some good, + sort-of-affordable restaurants but they're kind of driving distance. +

+ +

+ The best part about living there was meeting my wife. We would go on + long walks to get away from studying and wound up seeing + horse-and-carriages and the Governor's Palace and things like that. We + would also escape with her car to go to some of the surrounding towns to + get away to nice grocery stores and fun places to eat and explore on the + weekends. I also have family in the area so it was easy for me to stop + by home and say hi, although I know lots of students wanted to get as + far away from home as possible. +

+ +

Parting Words

+ +

+ I don't consider myself a gung ho alumnus. There are lots of things I + think could be improved, both in CS and at W&M as a whole but I do + not regret my going there. There is no such thing as "everything is + great" or "everything is terrible". It's not so definitive. I had my + fair share of gripes and at times it strained me. There were pros and + cons but I think I have a lot to be thankful for (I landed my job + through W&M recruiting and the career center as well, which are + fantastic resources). I cannot say "do this instead of that." I haven't + gone to any other colleges and don't know enough about them to recommend + them as better or worse. What I can recommend is the same path I took + for folks who want to pursue a degree in Computer Science. I think + you'll come away from it all the more knowledgable, resourceful, and + dedicated. +

+
+ + diff --git a/posts/2020-07-26-now-this-is-a-minimal-install.html b/posts/2020-07-26-now-this-is-a-minimal-install.html new file mode 100644 index 0000000..64652a7 --- /dev/null +++ b/posts/2020-07-26-now-this-is-a-minimal-install.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + 53hornet ➙ Now This is a Minimal Install! + + + + + +
+

Now This is a Minimal Install!

+ +

+ I just got done configuring Poudriere on Freebsd 12.1-RELEASE. The + awesome thing about it is it allows you to configure and maintain your + own package repository. All of the ports and their dependencies are + built from source with personalized options. That means that I can + maintain my own repo of just the packages I need with just the + compile-time options I need. For example, for the Nvidia driver set I + disabled all Wayland related flags. I use Xorg so there was no need to + have that functionality built in. +

+ +

+ Compile times are pretty long but I hope to change that by upgrading my + home server to FreeBSD as well (from Ubuntu Server). Then I can + configure poudriere to serve up a ports tree and my own pkg repo from + there. The server is a lot faster than my laptop and will build packages + way faster, and I'll be able to use those packages on both the server + and my laptop and any jails I have running. Jails (and ZFS) also make + poudriere really cool to use as all of the building is done inside a + jail. When the time comes I can just remove the jail and poudriere ports + tree from my laptop and update pkg to point to my web server. +

+ +

+ This is, as I understand it, the sane way to do package management in + FreeBSD. The binary package repo is basically the ports tree + pre-assembled with default options. Sometimes those packages are + compiled without functionality that most users don't need. In those + situations, you're forced to use ports. The trouble is you're not really + supposed to mix ports and binary packages. The reason, again as I + understand it, is because ports are updated more frequently. So binary + packages and ports can have different dependency versions, which can + sometimes break compatibility on an upgrade. Most FreeBSD users + recommend installing everything with ports (which is just a make install + inside the local tree) but then you lose the package management features + that come with pkg. Poudriere lets you kind of do both by creating your + "own personal binary repo" out of a list of preconfigured, pre-built + ports. +

+ +

FreeBSD rocks.

+
+ + diff --git a/posts/2020-11-30-titanics-last-signals.html b/posts/2020-11-30-titanics-last-signals.html new file mode 100644 index 0000000..f4a610a --- /dev/null +++ b/posts/2020-11-30-titanics-last-signals.html @@ -0,0 +1,73 @@ + + + + + + + + + + + + + 53hornet ➙ Titanic's Last Signals + + + + + +
+

Titanic's Last Signals

+

+ I forgot to post this back in April but 108 years ago, a chilling and + heroic conversation was had over the airwaves. This is a fascinating way + to hear the real conversations that took place the night the Titanic + went down with 1,496 souls. +

+ +
+ + diff --git a/posts/2020-12-01-the-guides.html b/posts/2020-12-01-the-guides.html new file mode 100644 index 0000000..48e2d79 --- /dev/null +++ b/posts/2020-12-01-the-guides.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + + 53hornet ➙ [The Guides] + + + + + +
+

𝔗𝔥𝔢 𝔊𝔲𝔦𝔡𝔢𝔰

+ +

+ This is partly satirical and purposefully strange to be humorous. These + are my personal rules for software development (and other projects where + I get carried away easily). +

+ +

The Guides. The Guiding Principles.

+ +

+ They guide you. They will not lead you astray. Obey The Guides. +

+ +

+ You've heard them go by different names. YAGNI. KISS. These are not + falsehoods, but they are not The Guides. Seek the wisdom of the + guides. +

+ +
+ 𝔗𝔥𝔬𝔲 𝔰𝔥𝔞𝔩𝔱 𝔴𝔯𝔦𝔱𝔢 𝔞𝔰 𝔩𝔦𝔱𝔱𝔩𝔢 𝔠𝔬𝔡𝔢 𝔞𝔰 𝔭𝔬𝔰𝔰𝔦𝔟𝔩𝔢 𝔱𝔬 𝔤𝔢𝔱 𝔱𝔥𝔢 𝔧𝔬𝔟 𝔡𝔬𝔫𝔢 𝔯𝔦𝔤𝔥𝔱. +
+ +
+ O Guides, may I please just add this one extra feature? It won't take me + long and it will be so nice to have later. +
+ +
+ 𝔗𝔥𝔬𝔲 𝔰𝔥𝔞𝔩𝔱 𝔴𝔯𝔦𝔱𝔢 𝖔𝖓𝖑𝖞 𝖙𝖍𝖊 𝖈𝖔𝖉𝖊 𝖓𝖊𝖈𝖊𝖘𝖘𝖆𝖗𝖞 𝔱𝔬 𝔤𝔢𝔱 𝔱𝔥𝔢 𝔧𝔬𝔟 𝔡𝔬𝔫𝔢 𝔯𝔦𝔤𝔥𝔱. +
+ +
+ O Guides, this can't be correct code. I haven't used proper software + development patterns, processes, or practices. +
+ +
+ 𝔓𝔞𝔱𝔱𝔢𝔯𝔫𝔰 𝔣𝔬𝔯 𝔱𝔥𝔢 𝔰𝔞𝔨𝔢 𝔬𝔣 𝔭𝔞𝔱𝔱𝔢𝔯𝔫𝔰 𝔞𝔯𝔢 𝔞𝔫𝔱𝔦-𝔭𝔞𝔱𝔱𝔢𝔯𝔫𝔰. +
+ +
+ O Guides, how may I approach this project pragmatically? +
+ +
ℌ𝔢𝔢𝔡 𝔱𝔥𝔢𝔰𝔢 𝔯𝔲𝔩𝔢𝔰:
+ +
    +
  1. + You may only write code directly related to the task at hand. Don't + get distracted. +
  2. +
  3. + Once you have working code, make it correct. Once it is correct, make + it secure. Once it is secure, make it small. Once it is small, stop. +
  4. +
  5. The enemy of good is better.
  6. +
+
+ + diff --git a/posts/2020-12-04-aoc-2020-day-1-in-cbm-basic.html b/posts/2020-12-04-aoc-2020-day-1-in-cbm-basic.html new file mode 100644 index 0000000..c59a893 --- /dev/null +++ b/posts/2020-12-04-aoc-2020-day-1-in-cbm-basic.html @@ -0,0 +1,231 @@ + + + + + + + + + + + + + 53hornet ➙ AOC 2020 Day 1 in CBM Basic + + + + + +
+

AOC 2020 Day 1 in CBM Basic

+ +

+ I implemented the + Advent of Code 2020 Day 1 + challenge in CBM BASIC on a real Commodore 64. I haven't done anything + in Basic in a long time, and probably never did anything actually + meaningful with it. Part 1 of the challenge was to take a list of + numbers, find the two that summed to 2020, and then multiply those two + numbers together. Part two was to perform part 1 but with three numbers + instead of two. +

+

+ Now I wanted to actually write the code on the Commodore 64 itself, but + I gave myself some leniency. Instead of manually typing in all 200 + entries of input data (and inevitably making a breaking mistake) I used + Vim on my PC to format the DATA entries at the start of the + code. I then dropped that onto a 1541 disk image, plopped it on an SD + card, and used my SD2IEC to mount the SD card's image on the Commodore. + The rest of the programming was done on the Commodore itself. +

+ +

Here is my solution for Day 1 Part 1:

+
+	  
+10 DATA 1686,  1983,  1801, 1890, 1910, 1722, 1571, 1952, 1602, 1551, 1144
+11 DATA 1208,  1335,  1914, 1656, 1515, 1600, 1520, 1683, 1679, 1800, 1889
+12 DATA 1717,  1592,  1617, 1756, 1646, 1596, 1874, 1595, 1660, 1748, 1946
+13 DATA 1734,  1852,  2006, 1685, 1668, 1607, 1677, 403 , 1312, 1828, 1627
+14 DATA 1925,  1657,  1536, 1522, 1557, 1636, 1586, 1654, 1541, 1363, 1844
+15 DATA 1951,  1765,  1872, 696,  1764, 1718, 1540, 1493, 1947, 1786, 1548
+16 DATA 1981,  1861,  1589, 1707, 1915, 1755, 1906, 1911, 1628, 1980, 1986
+17 DATA 1780,  1645,  741 , 1727, 524 , 1690, 1732, 1956, 1523, 1534, 1498
+18 DATA 1510,  372 ,  1777, 1585, 1614, 1712, 1650, 702 , 1773, 1713, 1797
+19 DATA 1691,  1758,  1973, 1560, 1615, 1933, 1281, 1899, 1845, 1752, 1542
+20 DATA 1694,  1950,  1879, 1684, 1809, 1988, 1978, 1843, 1730, 1377, 1507
+21 DATA 1506,  1566,  935 , 1851, 1995, 1796, 1900, 896 , 171,  1728, 1635
+22 DATA 1810,  2003,  1580, 1789, 1709, 2007, 1639, 1726, 1537, 1976, 1538
+23 DATA 1544,  1626,  1876, 1840, 1953, 1710, 1661, 1563, 1836, 1358, 1550
+24 DATA 1112,  1832,  1555, 1394, 1912, 1884, 1524, 1689, 1775, 1724, 1366
+25 DATA 1966,  1549,  1931, 1975, 1500, 1667, 1674, 1771, 1631, 1662, 1902
+26 DATA 1970,  1864,  2004, 2010, 504 , 1714, 1917, 1907, 1704, 1501, 1812
+27 DATA 1349,  1577,  1638, 1886, 1157, 1761, 1676, 1731, 2001, 1261, 1154
+28 DATA 1769,  1529
+100 DIM A(200)
+110 FOR I=0TO199
+120 READ A(I)
+140 NEXT
+150 FOR I=0TO199
+160 B=A(I)
+170 FOR J=0TO199
+180 IF I=J THEN 210
+190 C=A(J)
+200 IF B+C=2020 THEN PRINT "!",B,C,B*C:STOP
+210 NEXT J
+220 NEXT I 
+	  
+ +

+ I basically put all 200 numbers into data fields, and then defined an + array large enough to read them into with DIM. Then I + iterated over the array twice, checking each element against each other + element to see if they summed to 2020. If they did, I printed them both + and the product of the two found numbers and stopped further execution. +

+

+ There weren't really any special tricks to this implementation except + remembering that I shouldn't be checking whether a number could sum to + 2020 with itself. +

+ +

+ Then I got to move onto Part 2, and this is where things got + interesting. Comparing any three numbers from the data meant the + cognitively easiest way to solve the problem was a triple loop. This of + course meant O(n^3) time, which the Commodore struggled + with. I waited about an hour before I decided I could optimize just a + little bit to speed up the search. +

+ +

+ I figured that for three numbers to sum to 2020, they all had to be + pretty small. Most likely they were most (if not all) three digits + instead of four. So I figured I could sort the entry data to make the + search finish probably near the start of the first layer of iteration. + Keep in mind I didn't want to pre-sort the data, I wanted the Commodore + to work with the same exact input set it had for Part 1. So I turned to + the simplest sorting algorithm I could remember: + bubble sort. +

+ +

Here is my solution for Day 1 Part 2:

+ +
+	  
+10 DATA 1686,  1983,  1801, 1890, 1910, 1722, 1571, 1952, 1602, 1551, 1144
+11 DATA 1208,  1335,  1914, 1656, 1515, 1600, 1520, 1683, 1679, 1800, 1889
+12 DATA 1717,  1592,  1617, 1756, 1646, 1596, 1874, 1595, 1660, 1748, 1946
+13 DATA 1734,  1852,  2006, 1685, 1668, 1607, 1677, 403 , 1312, 1828, 1627
+14 DATA 1925,  1657,  1536, 1522, 1557, 1636, 1586, 1654, 1541, 1363, 1844
+15 DATA 1951,  1765,  1872, 696,  1764, 1718, 1540, 1493, 1947, 1786, 1548
+16 DATA 1981,  1861,  1589, 1707, 1915, 1755, 1906, 1911, 1628, 1980, 1986
+17 DATA 1780,  1645,  741 , 1727, 524 , 1690, 1732, 1956, 1523, 1534, 1498
+18 DATA 1510,  372 ,  1777, 1585, 1614, 1712, 1650, 702 , 1773, 1713, 1797
+19 DATA 1691,  1758,  1973, 1560, 1615, 1933, 1281, 1899, 1845, 1752, 1542
+20 DATA 1694,  1950,  1879, 1684, 1809, 1988, 1978, 1843, 1730, 1377, 1507
+21 DATA 1506,  1566,  935 , 1851, 1995, 1796, 1900, 896 , 171,  1728, 1635
+22 DATA 1810,  2003,  1580, 1789, 1709, 2007, 1639, 1726, 1537, 1976, 1538
+23 DATA 1544,  1626,  1876, 1840, 1953, 1710, 1661, 1563, 1836, 1358, 1550
+24 DATA 1112,  1832,  1555, 1394, 1912, 1884, 1524, 1689, 1775, 1724, 1366
+25 DATA 1966,  1549,  1931, 1975, 1500, 1667, 1674, 1771, 1631, 1662, 1902
+26 DATA 1970,  1864,  2004, 2010, 504 , 1714, 1917, 1907, 1704, 1501, 1812
+27 DATA 1349,  1577,  1638, 1886, 1157, 1761, 1676, 1731, 2001, 1261, 1154
+28 DATA 1769,  1529
+100 DIM A(200)
+110 FOR I=0TO199
+120 READ A(I)
+140 NEXT
+141 GOSUB 300
+150 FOR I=0TO199
+160 B=A(I)
+170 FOR J=0TO199
+180 IF J=I THEN 250
+190 C=A(J)
+200 FOR K=0TO199
+210 IF K=I OR K=J THEN 240
+220 D=A(K)
+230 IF B+C+D=2020 THEN PRINT "!",B,C,D,B*C*D:STOP
+240 NEXT K
+250 NEXT J
+260 NEXT I
+300 REM BUBBLE SORT
+301 X=200
+310 N=200
+320 FOR I=0TON-2
+330 FOR J=0TON-I-2
+340 X=A(J):Y=A(J+1)
+350 IF X>Y THEN A(J)=Y:A(J+1)=X
+360 NEXT : NEXT
+370 RETURN 
+	  
+	  
+ +

+ I added a subroutine starting on line 300 to perform a basic bubble sort + on top of the original array of data. Now bubble sort isn't fast by any + means, but the Commodore was able to finish it in a couple of minutes. + And the results were worth it because the subsequent triple + FOR-loop completed in another few minutes. My instinct was + right and two of the solution numbers were triple-digit. +

+ +

+ So there you have it, Advent of Code 2020 Day 1 in Commodore 64 Basic + V2. You can run these samples on real hardware of course, or in an + emulator. You can also run them with the + cbmbasic + interpreter, which is a neat native C64 Basic interpreter for modern + architectures. (Oh and I tested my samples on cbmbasic and + they finished instantaneously. It helps to have a + thousands-of-times-faster processor.) +

+ +

+ I was going to keep going with the challenge and finish them all in CBM + basic for fun, but the Day 2 input data set was 1000 entries. No + problem, I can just read them from a SEQ file. The only + blocker I realized was the challenge requires string character counting, + which I don't think there's a function for in CBM basic. Maybe I have to + do a few PEEKs and POKEs to check memory + locations for ASCII/PETSCII character codes. Or I could just put it off + til next year :) +

+
+ + diff --git a/posts/2020-12-08-useful-sprint-planning-from-a-certified-scrum-master.html b/posts/2020-12-08-useful-sprint-planning-from-a-certified-scrum-master.html new file mode 100644 index 0000000..0d5fffe --- /dev/null +++ b/posts/2020-12-08-useful-sprint-planning-from-a-certified-scrum-master.html @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + 53hornet ➙ Useful Sprint Planning from a Certified Scrum Master + + + + + + +
+

Useful Sprint Planning from a Certified Scrum Master

+ +

+ This is a small collection of sprint planning/story points allocation + tips and tricks that I use at work. They pretty much all come from our + in-house certified "Scrum Master". He's got much better experience than + I do with building a real working backlog of stories and planning + sprints based on those stories. That being said, any opinions here are + my own and I don't speak on his behalf. +

+ +

Points as a Measure of Work

+ +

+ In my understanding, points are approximate measures of the amount of + work required to complete a given story or task. I do not think points + correlate to an exact measure of time. I use them to determine the size + of a task in relation to another task. For example, a simple-looking + task may be allocated 1 point. In reality this 1 point may take 1 minute + or 1 hour to complete. The time it takes is less important than the + ratio of time it takes in comparison to a second given task. Say the + second task appears to take twice as much time as the first (however + much time that may be). The second task would therefore get 2 points. +

+ +

+ Some teams have a special system for incrementing points. Our team uses + the + Fibonacci sequence of numbers. So the smallest amount that can be allocated to a story is 1. Then it + goes 2, 3, 5, 8, and so on and so forth. If a single story is going to + use up 8 points, you should probably take a look at breaking it up into + smaller tasks. A single story shouldn't take up almost half of your + allocated work for a sprint. +

+ +

How Much is Enough?

+

+ Our team aims for 10 points per 2-week per sprint. Simple enough for me, + but the hard part is determining how many points to allocate to a given + task. +

+ +

+ One thing I could never figure out is what the recommended starting + position for 1 point looks like. I'm sure this is something that comes + from experience, and our Scrum Master helped us out with that. +

+ + + +

Prioritizing Work

+ +

+ I do not see points as indicative of the importance or priority of a + task or story. Just because one task will take longer to complete than + another does not mean it's more or less important to me. There should be + another method of gauging which stories should be taken off the backlog + first. For example, one story might depend on another. One might relate + to core functionality that a stakeholder has asked for. Another task + might be required to make code build because it solves some major + problem! +

+ +

+ To communicate how "important" a task is, every story we have is + prioritized something like this: +

+
    +
  1. Critical
  2. +
  3. Blocker
  4. +
  5. Highest
  6. +
  7. High
  8. +
  9. Medium
  10. +
  11. Low
  12. +
  13. Lowest
  14. +
+ +

+ Tasks that align with some long-term project that management is waiting + on are tagged "Highest". Stories that prevent lots of other stories from + being completed may be labeled "Blocker". +

+ +

Sprint Planning/Backlog Refinement

+ +

+ With all that in mind, at the start of the sprint I now take about 10 + points worth of priority work off of the backlog. I'll work through it + the whole sprint through and then, ideally, it'll all be complete by the + end of the sprint. If I bit off more than I could chew and the sprint + ends before I'm finished, the incomplete work rolls over to the next + sprint and is the first to be completed. If I find I've finished + everything I had to work on and there are still a couple of days left in + the sprint, I'll take one or two small items off the backlog and work on + those. +

+ +

Tools to Get the Job Done

+ +

+ Our team uses Jira at work, and I know some folks love it so much + they've paid for a personal license. It's a bit overkill for my personal + projects, so I've been using Nextcloud's Deck plugin. This is an okay + solution but it doesn't integrate very well with source code + repositories (although it can tie into a Nextcloud "project", or a + collection of related files open to a team). I'm spinning up a Gitea + server to replace my git-web server soon and this is one of + the reasons for that. Gitea has a GitHub-style issue tracker where you + can create issues of various kinds, assign them to users, reference + commits to the source, and create a Kanban-style board of issues that + are on the backlog, to-do, in-progress, or done. +

+ +

+ I'm still learning how to keep to a Scrum-like process of some kind, + because I do see the benefit of using such a system, especially in a + team. I'm definitely not an expert though so some of what I've got here + may change over time. Right now it's working well and that's good enough + for me. +

+
+ + diff --git a/posts/2020-12-22-why-does-everyone-use-adobe-acrobat-reader.html b/posts/2020-12-22-why-does-everyone-use-adobe-acrobat-reader.html new file mode 100644 index 0000000..81136e8 --- /dev/null +++ b/posts/2020-12-22-why-does-everyone-use-adobe-acrobat-reader.html @@ -0,0 +1,144 @@ + + + + + + + + + + + + + 53hornet ➙ Why Does Everyone Use Adobe Acrobat [Reader]? + + + + + +
+

Why Does Everyone Use Adobe Acrobat [Reader]?

+ +

+ +

+ +

+ This is something that I've never been able to figure out. All through + high school I had to use PDFs. And if you wanted to open a PDF, everyone + understood that you needed Adobe Acrobat Reader. Even web sites where + you downloaded PDFs insisted that in order to open them, you were going + to have to follow a download link to make sure you have Acrobat on your + PC. +

+ +

+ Fast-forward a few years into college and I'm using PDFs more than ever. + Every professor ever is scanning and uploading course material, so out + comes Acrobat Reader for literally every teacher and student. At this + point I was actually used to using Firefox (PDF.js) to view PDFs for a + couple of reasons. First of all, Firefox usually opened PDFs faster than + Acrobat Reader did. Reader was getting bigger with every release, and + eventually had a monstrous UI to load up every time I wanted to open a + tiny PDF file. Second, Firefox had smooth scrolling for page-width + documents. Reader was getting slower and laggier with each release, to + the point where scrolling through a PDF was no longer buttery smooth but + jittery and stuttery. It also seemed like Reader purposefully wouldn't + slide the page when you used a mouse wheel. It would jump down a few + lines at a time like it was simulating the down arrow. +

+ +

+ By my senior year I had switched from Windows to Linux full-time and it + was then I found out about MuPDF and + from then on things were never the same. It's literally the best PDF + reader I've ever used, and I tried out quite a few. There are desktop + and mobile apps. It opens almost instantly. It lets you easily resize + the page with excellent keyboard shortcuts. There are no giant menu bars + on either side of the page to squish the document down to an unreadable + size. Having a dozen of them open at once doesn't bog down my PC. It's + also available for all of the relevant operating systems I've used + (Windows, Mac OS, Linux, FreeBSD)! Oh and password-protected PDFs are + supported as well. +

+ +

+ It's a fantastic piece of software And the best part is it comes with a + variety of tools to edit and manipulate PDFs as well. If the folks I + went to school with thought you needed the free Acrobat Reader to view a + PDF, they sure as heck thought you needed to buy Acrobat Pro to edit + one. Some of them refused to pay for it and used a variety of online + services to upload, split or merge, and download PDFs. I honestly for + the life of me can't understand why. MuPDF comes with + mutool, which does all of the things I would ever need to + do with a PDF. It can attempt to convert a PDF to other formats, like + HTML. It can split and combine documents. It can even create them from + scratch and sign them. +

+ +

+ It's also free and open source. Can you imagine that? PDF viewing and + editing being free and open source? It's AGPL (in addition to being + commercially) licensed by the creators. The only slight drawback is the + desktop version apparently does not yet let you fill out forms. Not sure + why but this isn't something I use very frequently. +

+ +

+ It's not the hottest piece of tech out there, but it just plain works + and works really well. Maybe the only reason more people I know don't + use it is because Adobe is synonymous with the PDF format. It doesn't + seem like that big of a deal, but I feel like Acrobat has always been a + piece of software that has frustrated new or infrequent users in + computing. And that's just not good. Maybe the barrier to using MuPDF is + the lack of GUI and abundance of keybindings, but for me that's no + sweat. I'd say to anyone to just try it out and see if they like it. It + is free, after all. +

+
+ + diff --git a/posts/2020-12-29-antivirus-software-is-a-hack.html b/posts/2020-12-29-antivirus-software-is-a-hack.html new file mode 100644 index 0000000..9aec081 --- /dev/null +++ b/posts/2020-12-29-antivirus-software-is-a-hack.html @@ -0,0 +1,197 @@ + + + + + + + + + + + + + 53hornet ➙ Antivirus Software is a Hack + + + + + +
+

Antivirus Software is a Hack

+ +

+ +

+ +

+ I read a really terrific article today about computer security and + really dumb ideas or trends that have developed in this field. It's + M. Ranum's The Six Dumbest Ideas in Computer Security, and I highly recommend reading through the whole thing. It's got + great anecdotes and really simple language for what I consider to be + some of the obvious issues with the way programmers and sysadmins think + about security (myself included). One portion of it (idea #2), however, + finally put something into words that I've felt for a really long time. + It enables me to explain why I think all antivirus software is a total + hack and is virtually useless. +

+ +
+ hack
+ 1. n. Originally, a quick job that produces what is needed, but not + well. +
+ +

+ This is the Jargon File's definition of a hack. And to me, this is what + antivirus software is. Antivirus software, as I understand it, emerged + in the mid to late 1980s and became prolific in the 1990s. In the 2000s + it was considered an essential piece of software and people were paying + for yearly subscriptions for antivirus suites from Norton, Avast, and + McAfee. +

+ +

+ The most basic functionality of an antivirus program is to determine + whether malware exists on a host operating system. The typical method of + doing this is to use a collection of virus definitions and compare each + and every potentially-infected file with each and every definition to + determine whether the file is malware or has been infected by some. An + over-simplified way of implementing this is to store a collection of + hashes, each taken from a known potentially unwanted program or + infectious executable. You can then hash entire files or portions of + files and compare the checksums to see whether a file contains or is + equivalent to the definition, and is therefore infected and shouldn't be + executed. Some security suites go beyond this with heuristic matching, + but if you run an antivirus that has to "update definitions" on a + routine basis, it probably works something like this*. With any luck, it + does it without being a total detriment to system performance. Ideally + it also doesn't act like a piece of malware itself by making itself near + impossible to remove (looking at you, McAfee). +

+ +

+ To me, a virus definition database is "enumerating badness" (Ranum's + Dumb Idea #2). The premise is that it is not only logical but even + possible to compile a list of all potentially unwanted + programs, viruses, ransomware, and worms. An environment of trust should + be built around the programs that you want to run (read: + allow to run), not the other way around. Picture an operating + system where no binary file can be executed unless it is specifically + flagged as being allowed to. Oh and picture also being able to restrict + this execution to just the file's owner, or other groups of users. + Wouldn't it be easier to store the list of 30 odd programs that you and + other system users trust to be run than the thousands (millions?) of + programs that are infectious, forbidden, or unwanted? What about when + those trusted applications become compromised? Would it not also be + easier to maintain a list of checksums for those binaries and compare + those checksums before they're executed to make sure they haven't been + infected or replaced? +

+ +

+ The answer is yes, it would be easier. And yes, it is easier. Of course, + your system has to work that way. Antivirus software is a hack because + it's a hack-y solution to a problem that has a better, simpler solution. + It also has the potential for making a ton of money but I won't go into + that. It's easier to enumerate goodness, to specifically open up to a + select few trustworthy applications. Good lists are usually shorter than + bad lists. This builds on top of Ranum's Dumb Idea #1: Default Permit. + You wouldn't configure a firewall to just block some known bad ports and + traffic. You configure it to block all of it, and then whitelist the + ones you know you can trust. You wouldn't configure a browser ad-blocker + to permit all ads, and select the ones you don't want to see. You block + all of them! Then, if there are sites or ads you're okay with seeing, + you whitelist them. You shouldn't default permit all programs to be + given control over your computer, and then meticulously list the ones + that don't have that permission. +

+ +

+ Oh and of course, as always, there's free software that lets you do + this. You don't have to pay for an antivirus suite, or even use an + unpaid one that slows down your computer or barrages you with ads. On + the BSDs and virtually all Linux distributions, there are built-in tools + to control access and execution of binaries. There are additional tools + that you can install that check whether binaries (in locations like + /bin or /usr/local/bin have been modified + since you last used them. On Windows, the story is a little different. + Most home Windows 10 users are automatically allowed to install and run + any software they want to by default. Windows Server does have Software + Restriction Policies that allow you to create a "default deny" policy + and whitelist only the software that's allowed to run. If you're using a + home edition you probably have to look for software that lets you do + this. I haven't tried any of them so I'm not going to endorse or even + name them here. +

+ +

+ Preventing malware from running on your system is a problem. Solving + this problem is the right thing to do. But please, try to solve it the + right way. I stopped using an antivirus after I moved out and got to + control my own computer. I don't think it ever did me any good besides + flag false positives (a lot of the time with programs or applications + that I wrote, which weren't malicious in any way!) and grind my spinning + disk to a halt. Evaluate what software you use. Is most of it online? + Are there one or two applications that you know you need to use? How + often do you install and use unknown or untrusted software? Odds are you + can come up with a list of very few programs that you want or need to + use. If it's less than 100,000, you're probably better off with a + default deny policy than an antivirus suite. +

+ +

+ * What I didn't mention here is that as soon as a new piece of malware + is constructed, if it's different enough from its predecessors, it's + impervious to all antivirus suites on the planet that don't have it in + their definitions. So until that malware is used, detected, and added to + the list, it has free reign. +

+
+ + diff --git a/posts/2021-01-15-adam-s-2020-reading-list.html b/posts/2021-01-15-adam-s-2020-reading-list.html new file mode 100644 index 0000000..639e384 --- /dev/null +++ b/posts/2021-01-15-adam-s-2020-reading-list.html @@ -0,0 +1,196 @@ + + + + + + + + + + + + + 53hornet ➙ Adam's 2020 Reading List + + + + + +
+

Adam's 2020 Quarantine Reading List

+ + +
+ + diff --git a/posts/2021-01-15-root-on-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html b/posts/2021-01-15-root-on-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html new file mode 100644 index 0000000..6f515f3 --- /dev/null +++ b/posts/2021-01-15-root-on-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html @@ -0,0 +1,375 @@ + + + + + + + + + + + + + 53hornet ➙ Root on ZFS: A ZPool of Mirror VDEVs The Easy Way + + + + + +
+

Root on ZFS: A ZPool of Mirror VDEVs

+ +

+ I wanted/needed to make a root on ZFS pool out of multiple mirror VDEVs, + and since I'm not a ZFS expert, I took a little shortcut. +

+ +

+ I recently got a new-to-me server (yay!) and I wanted to do a + root-on-ZFS setup on it. I've really enjoyed using ZFS for my data + storage pools for a long time. I've also enjoyed the extra functionality + that comes with having a bootable system installed on ZFS on my laptop + and decided with this upgrade it's time to do the same on my server. + Historically I've used RAIDZ for my storage pools. RAIDZ functions + almost like a RAID10 but at the ZFS level. It gives you parity so that a + certain number of disks can die from your pool and you won't lose any + data. It does have a few tradeoffs however*, and for personal + preferences I've decided that for the future I would like to have a + single ZPool over top of multiple mirror VDEVs. In other words, my main + root+storage pool will be made up of two-disk mirrors and can be + expanded to include any number of new mirrors I can fit into the + machine. +

+ +

+ This did present some complications. First of all, + bsdinstall won't set this up for you automatically (and + sure enough, + in the handbook + it mentions the guided root on ZFS tool will only create a single, + top-level VDEV unless it's a stripe). It will happily let you use RAIDZ + for your ZROOT but not the more custom approach I'm taking. I did + however use + bsdinstall as a shortcut so I wouldn't have to do all of + the partitioning and pool setup manually, and that's what I'm going to + document below. Because I'm totally going to forget how this works the + next time I have to do it. +

+ +

+ In my scenario I have an eight-slot, hot-swappable PERC H310 controller + that's configured for AHCI passthrough. In other words, all FreeBSD sees + is as many disks as I have plugged into the backplane. I'm going to fill + it with 6x2TB hard disks which, as I said before, I want to act as three + mirrors (two disks each) in a single, bootable, growable ZPool. For + starters, I shoved the FreeBSD installer on a flash drive and booted + from it. I followed all of the regular steps (setting hostname, getting + online, etc.) until I got to the guided root on ZFS disk partitioning + setup. +

+ +

+ Now here's where I'm going to take the first step on my shortcut. Since + there is no option to create the pool of arbitrary mirrors I'm just + going to create a pool from a single mirror VDEV of two disks. Later I + will expand the pool to include the other two mirrors I had intended + for. My selections were as follows: +

+ + + +

+ Everything else was left as a default. Then I followed the installer to + completion. At the end, when it asked if I wanted to drop into a shell + to do more to the installation, I did. +

+ +

+ The installer created the following disk layout for the two disks that I + selected. +

+ +
+
+atc@macon:~ % gpart show
+=>        40  3907029088  mfisyspd0  GPT  (1.8T)
+          40      409600          1  efi  (200M)
+      409640        2008             - free -  (1.0M)
+      411648     8388608          2  freebsd-swap  (4.0G)
+     8800256  3898228736          3  freebsd-zfs  (1.8T)
+  3907028992         136             - free -  (68K)
+
+=>        40  3907029088  mfisyspd1  GPT  (1.8T)
+          40      409600          1  efi  (200M)
+      409640        2008             - free -  (1.0M)
+      411648     8388608          2  freebsd-swap  (4.0G)
+     8800256  3898228736          3  freebsd-zfs  (1.8T)
+  3907028992         136             - free -  (68K)
+
+
+ +

+ The installer also created the following ZPool from my single mirror + VDEV. +

+ +
+
+atc@macon:~ % zpool status
+  pool: zroot
+ state: ONLINE
+  scan: none requested
+config:
+
+	NAME             STATE     READ WRITE CKSUM
+	zroot            ONLINE       0     0     0
+	  mirror-0       ONLINE       0     0     0
+	    mfisyspd0p3  ONLINE       0     0     0
+	    mfisyspd1p3  ONLINE       0     0     0
+
+errors: No known data errors
+
+
+ +

+ There are a couple of things to take note of here. First of all, + both disks in the bootable ZPool have an EFI boot partition. + That means they're both a part of (or capable of?) booting the pool. + Second, they both have some swap space. Finally, they both have a third + partition which is dedicated to ZFS data, and that partition is what got + added to my VDEV. +

+ +

+ So where do I go from here? I was tempted to just + zpool add mirror ... ... and just add my other disks to the + pool (actually, I did do this but it rendered the volume + unbootable for a very important reason), but then I wouldn't have those + all-important boot partitions (using whole-disk mirror VDEVS). Instead, + I need to manually go back and re-partition four disks exactly like the + first two. Or, since all I want is two more of what's already been done, + I can just clone the partitions using gpart backup and + restore! Easy! Here's what I did for all four remaining + disks: +

+ +
+
+root@macon:~ # gpart backup mfisyspd0 | gpart restore -F mfisyspd2`
+
+
+ +

+ Full disclosure, I didn't even think of this as a possibility + until I read this Stack Exchange post. This gave me a disk layout like this: +

+ +
+
+atc@macon:~ % gpart show
+=>        40  3907029088  mfisyspd0  GPT  (1.8T)
+          40      409600          1  efi  (200M)
+      409640        2008             - free -  (1.0M)
+      411648     8388608          2  freebsd-swap  (4.0G)
+     8800256  3898228736          3  freebsd-zfs  (1.8T)
+  3907028992         136             - free -  (68K)
+
+=>        40  3907029088  mfisyspd1  GPT  (1.8T)
+          40      409600          1  efi  (200M)
+      409640        2008             - free -  (1.0M)
+      411648     8388608          2  freebsd-swap  (4.0G)
+     8800256  3898228736          3  freebsd-zfs  (1.8T)
+  3907028992         136             - free -  (68K)
+
+=>        40  3907029088  mfisyspd2  GPT  (1.8T)
+          40      409600          1  efi  (200M)
+      409640        2008             - free -  (1.0M)
+      411648     8388608          2  freebsd-swap  (4.0G)
+     8800256  3898228736          3  freebsd-zfs  (1.8T)
+  3907028992         136             - free -  (68K)
+
+=>        40  3907029088  mfisyspd3  GPT  (1.8T)
+          40      409600          1  efi  (200M)
+      409640        2008             - free -  (1.0M)
+      411648     8388608          2  freebsd-swap  (4.0G)
+     8800256  3898228736          3  freebsd-zfs  (1.8T)
+  3907028992         136             - free -  (68K)
+
+=>        40  3907029088  mfisyspd4  GPT  (1.8T)
+          40      409600          1  efi  (200M)
+      409640        2008             - free -  (1.0M)
+      411648     8388608          2  freebsd-swap  (4.0G)
+     8800256  3898228736          3  freebsd-zfs  (1.8T)
+  3907028992         136             - free -  (68K)
+
+=>        40  3907029088  mfisyspd5  GPT  (1.8T)
+          40      409600          1  efi  (200M)
+      409640        2008             - free -  (1.0M)
+      411648     8388608          2  freebsd-swap  (4.0G)
+     8800256  3898228736          3  freebsd-zfs  (1.8T)
+  3907028992         136             - free -  (68K)
+
+
+ +

+ And to be fair, this makes a lot of logical sense. You don't want a + six-disk pool to only be bootable by two of the disks or you're + defeating some of the purposes of redundancy. So now I can extend my + ZPool to include those last four disks. +

+ +

+ This next step may or may not be a requirement. I wanted to overwrite + where I assumed any old ZFS/ZPool metadata might be on my four new + disks. This could just be for nothing and I admit that, but I've run + into trouble in the past where a ZPool wasn't properly + exported/destroyed before the drives were removed for another purpose + and when you use those drives in future + zpool imports, you can see both the new and the old, failed + pools. And, in the previous step I cloned an old ZFS partition many + times! So I did a small dd on the remaining disks to help + me sleep at night: +

+ +
+
+root@macon:~ # dd if=/dev/zero of=/dev/mfisyspd2 bs=1M count=100
+
+
+ +

+ One final, precautionary step is to write the EFI boot loader to the new + disks. In + zpool admin handbook + it mentions you should do this any time you replace a zroot + device, so I'll do it just for safe measure on all four additional + disks: +

+ +
+
+root@macon:~ # gpart bootcode -p /boot/boot1.efifat -i 1 mfisyspd2
+
+
+ +

+ Don't forget that the command is different for UEFI and a traditional + BIOS. And finally, I can add my new VDEVs: +

+ +
+
+root@macon:~ # zpool zroot add mirror mfisyspd2p3 mfisyspd3p3
+root@macon:~ # zpool zroot add mirror mfisyspd4p3 mfisyspd5p3
+
+
+ +

And now my pool looks like this:

+ +
+
+atc@macon:~ % zpool status
+  pool: zroot
+ state: ONLINE
+  scan: none requested
+config:
+
+	NAME             STATE     READ WRITE CKSUM
+	zroot            ONLINE       0     0     0
+	  mirror-0       ONLINE       0     0     0
+	    mfisyspd0p3  ONLINE       0     0     0
+	    mfisyspd1p3  ONLINE       0     0     0
+	  mirror-1       ONLINE       0     0     0
+	    mfisyspd2p3  ONLINE       0     0     0
+	    mfisyspd3p3  ONLINE       0     0     0
+	  mirror-2       ONLINE       0     0     0
+	    mfisyspd4p3  ONLINE       0     0     0
+	    mfisyspd5p3  ONLINE       0     0     0
+
+errors: No known data errors
+
+
+ +

+ Boom. A growable, bootable zroot ZPool. Is it easier than just + configuring the partitions and root on ZFS by hand? Probably not for a + BSD veteran. But since I'm a BSD layman, this is something I can live + with pretty easily. At least until this becomes an option in + bsdintall maybe? At least now I can add as many more + mirrors as I can fit into my system. And it's just as easy to replace + them. This is better for me than my previous RAIDZ, where I would have + to destroy and re-create the pool in order to add more disks to the + VDEV. Now I just create another little mirror and grow the pool and all + of my filesystems just see more storage. And of course, having ZFS for + all of my data makes it super easy to create filesystems on the fly, + compress or quota them, and take snapshots (including the live ZROOT!) + and send those snapshots over the network. Pretty awesome. +

+ +

+ * I'm not going to explain why here, but + this is a pretty well thought out article + that should give you an idea about the pros and cons of RAIDZ versus + mirror VDEVs so you can draw your own conclusions. +

+
+ + diff --git a/posts/2021-01-28-undefined-javasript-is-undefined.html b/posts/2021-01-28-undefined-javasript-is-undefined.html new file mode 100644 index 0000000..e12203b --- /dev/null +++ b/posts/2021-01-28-undefined-javasript-is-undefined.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + 53hornet ➙ Undefined? JavaSript Is Undefined. + + + + + +
+

Undefined? JavaSript Is Undefined.

+ +

+ So I've been working on a web app for my mom. Nothing too fancy, but + it's a store front for her glass art. It's an easy way for her to keep + track of inventory, update photos of her products, and for people to + shop and search and sort and browse through it. This backend is an HTTP + service written in Rust. The frontend is a Vue.js app. I've used Vue and + JavaScript many times before but I recently ran into an incredibly + strange bug. One that I would have hoped JavaScript would have some + guard against. But JavaScript is an undefined language. +

+ +

+ I have a small component that uses a file input to collect an image from + the user. Then I append that file to a FormData and set that FormData as + a Fetch API request body. So I've got fetch API sending + multipart/form-data across the network to my backend. Awesome! The + backend is supposed to take each field of the request, turn the chunks + into a single stream of binary data, and write them out to an image. + Everything on the front seems like it's working great, it fires off the + request and throws no errors. But then the backend only sees a few bytes + of this multi-megabyte image. Not awesome! short chunks on the back-end. + The array of data in the API is less than ten bytes long, when this is a + many-kilobyte file I'm trying to upload. +

+ +

+ At this point I'm relentlessly debugging, trying to find out what's + wrong with the API. Why is it truncating the request down to a few + bytes, where's the rest of the data? It took me forever to actually + inspect what those few bytes are and, lo and behold they're ASCII for + undefined The request happily stringified an + undefined object, instead of maybe throwing a null + reference or undefined error during request creation because that's just + what JavaScript does. The linter didn't even catch it. +

+ +

+ You can see what the debugging logs looked like on the backend below. + Note that the &data is the field that spells out + "undefined". Also note that the file picker/FormData was constructed + alright because the key for the image name is correct. +

+ +
+		
+[src/handlers.rs:114] &field =
+Field: application/octet-stream
+  boundary: ---------------------------175314640631070190963311652907
+  headers:
+    "content-disposition": "form-data; name=\"clu.jpg\""
+
+[src/handlers.rs:119] &chunk = Ok(
+    b"undefined",
+)
+[src/handlers.rs:123] &data = [
+    117,
+    110,
+    100,
+    101,
+    102,
+    105,
+    110,
+    101,
+    100,
+]
+ImageWrite("The image format could not be determined")
+		
+	
+ +

+ The working JS is here (it was late at night and I was so + donion rings I just fixed it and pushed it without saving the errors for + posterity): +

+ +
+	  
+let file = event.target.files[0];
+if (!file) {
+	return;
+}
+
+const fd = new FormData();
+fd.append(file.name, file);
+
+const response = await fetch("http://localhost:8000/photos", {
+	method: "POST",
+	body: fd
+});
+
+console.log(response);
+	  
+	  
+

+ I've gotten frustrated by JS before but not like this. I don't know if + TypeScript would have solved this issue but writing in a language that + gets transpiled back into the language I'm trying to avoid doesn't seem + like the way forward. I'm looking forward to Web Assembly as a way of + using more type-safe languages in the browser. +

+
+ + diff --git a/posts/2021-02-12-louis-vierne-is-a-bamf-and-proof-that-organists-are-metal.html b/posts/2021-02-12-louis-vierne-is-a-bamf-and-proof-that-organists-are-metal.html new file mode 100644 index 0000000..11ada08 --- /dev/null +++ b/posts/2021-02-12-louis-vierne-is-a-bamf-and-proof-that-organists-are-metal.html @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + 53hornet ➙ Louis Vierne Is a BAMF (and Proof That Organists Are Metal) + + + + + + +
+

Louis Vierne Is a BAMF (and Proof That Organists Are Metal)

+ +

+ Louis Vierne is a certifiable badass organist from the end of the 19th + and early 20th centuries. He was born blind and had to have surgery to + be able to distinguish shapes and objects. Did that stop him from + playing the one instrument that literally requires you to distinguish + hundreds and hundreds of small objects from each other? Nope, he just + did it (and he learned from Cesar Franck, another great organist). +

+ +

+ In 1906 he got hit by a car and the doctors said they might have to + amputate his leg. Did you know you play an organ with both your hands + and both your feet? Well you do, and Vierne just re-learned how + to play with his feet after the accident. Because nobody tells Louis + Vierne no. +

+ +

+ And because he's a badass, Vierne went on to become the official + organist at the Notre Dame in Paris, a position he won by competitively + dunking on numerous other musicians. He considered this his greatest + achievement, and what Louis Vierne says goes. +

+ +

+ In one final act of badassery, he carried out his lifelong dream: to die + while playing at Notre Dame. In 1937, to a full recital hall in Notre + Dame, he was giving his 1,750th performance and actually + had a heart-attack while playing and died at the console, and keeled + over so that the low "E" played until they removed his body. To this day, no rock band has ever been so metal. +

+ +
+ +

+ Alright, so without the decoration, Louis Vierne is my favorite Organist + and composer from the period. The organ is, in my opinion, the coolest + instrument on the planet. It's the biggest, the loudest, and the most + impressive. It's also got the most wide and interesting array of sounds, + like having an orchestra at your fingertips. Vierne made some of my + favorite music for the organ (music that my lowly organ skills will + never let me play). He's also, obviously, pretty badass. +

+ +

+ In truth, I think all organists are pretty cool. They play a cool, + complicated instrument that really sounds like no other. They also play + with their hands and their feet. Someone once said when a musician mates + with an octopus, an organist is born. Come to think of it, Davy Jones + plays the Organ and he's pretty cool. Coincidence? I think not. +

+ +

+ If you get the chance, give Vierne a listen, you can look up his work on + YouTube or a Pandora Radio station in his name. Look especially for + Symphony No. 1 for Organ in D Minor, Op. 14. That's the first song I + heard of his live (and in my understanding is the one he was playing + when he died). +

+
+ + diff --git a/posts/2021-03-19-how-to-automate-certbot-renewal-with-haproxy.html b/posts/2021-03-19-how-to-automate-certbot-renewal-with-haproxy.html new file mode 100644 index 0000000..634530b --- /dev/null +++ b/posts/2021-03-19-how-to-automate-certbot-renewal-with-haproxy.html @@ -0,0 +1,256 @@ + + + + + + + + + + + + + 53hornet ➙ How to Automate Certbot Renewal with HAProxy + + + + + +
+

How to Automate Certbot Renewal with HAProxy

+ +

+ So this is specifically for HAProxy on FreeBSD, but it should apply to + other *nix systems as well. Basically, I use HAProxy as a reverse proxy + to a bunch of servers I administer. I use Let's Encrypt for a + certificate and I used certbot to generate that + certificate. Generating the certificate for the first time is easy and + has lots of documentation, but it wasn't initially clear on how I could + easily set up auto-renewal. Here's how I did it. +

+ +

+ If you've already set up TLS termination with HAProxy and + certbot, you know you need to combine your Let's Encrypt + fullchain and private key to get a combined certificate that HAProxy can + use. You can do this by cat-ing the chain and key together + like so: +

+ +
+
+cat /usr/local/etc/letsencrypt/live/$SITE/fullchain.pem /usr/local/etc/letsencrypt/live/$SITE/privkey.pem > /usr/local/etc/ssl/haproxy.pem
+
+	  
+ +

+ In this example, $SITE is your domain name that you fed + HAProxy when you created the certificate and haproxy.pem is + wherever you're storing HAProxy's combined certificate. Your HAProxy + config then points to that certificate like this: +

+ +
+
+macon% grep crt /usr/local/etc/haproxy.conf
+        bind *:443 ssl crt /usr/local/etc/ssl/haproxy.pem
+
+	  
+ +

+ And that was the end of the first-time setup. Then a few months later + you probably had to do it again because Let's Encrypt certs are only + good for 90 days in between renewals. To renew the certificate, you + usually run certbot renew, it detects which certificates + are present, and uses either the webroot or standlone server renewal + process. Then you have to cat the fullchain and privkey + together and restart HAProxy so it starts using the new certificate. +

+ +

+ To automate those steps, newer versions of + certbot will run any post renewal hooks (read: scripts) + that you want. You can also configure HAProxy and + certbot to perform the ACME challenge dance for renewal so + that you don't have to use it interactively. +

+ +

+ First, if you haven't already done it, change your HAProxy config so + there's a frontend+backend for responding to ACME challenges. In a + frontend listening for requests, create an access control list for any + request looking for /.well-known/acme-challenge/. Send + those requests to a backend server with an unused local port. +

+ +
+
+frontend http-in
+		acl letsencrypt-acl path_beg /.well-known/acme-challenge/
+        use_backend letsencrypt-backend if letsencrypt-acl
+		...
+backend letsencrypt-backend
+		server letsencrypt 127.0.0.1:54321
+
+	  
+ +

+ What this will do is allow certbot and Let's Encrypt to + renew your server in standalone mode via your reverse proxy. As an added + bonus it prevents you from having to open up an additional port on your + firewall. +

+ +

+ Now you've gotta configure certbot to do just that. A + config file was created in certbot's + renew directory for your site. All you need to do in that + file is add a line to the [renewalparams] section + specifying the port you're using in your HAProxy config. +

+ +
+
+macon% echo "http01_port = 54321" >> /usr/local/etc/letsencrypt/renewal/$SITE.conf
+
+	  
+ +

+ Now you need the post-renewal hooks. I dropped two separate scripts into + the renewal-hooks directory: one does the job of combining + the certificate chain and private key and the other just restarts + HAProxy. +

+ +
+
+macon% cat /usr/local/etc/letsencrypt/renewal-hooks/post/001-catcerts.sh
+#!/bin/sh
+
+SITE=(your site of course)
+
+cd /usr/local/etc/letsencrypt/live/$SITE
+cat fullchain.pem privkey.pem > /usr/local/etc/ssl/haproxy.pem
+macon% cat /usr/local/etc/letsencrypt/renewal-hooks/post/002-haproxy.sh
+#!/bin/sh
+service haproxy restart
+
+	  
+ +

+ When certbot renew is run, certbot checks the + renewal-hooks/post directory and runs any executable things + in it after it's renewed the certificate(s). As a side note, + make sure you hit those scripts with chmod +x or + they probably won't run. +

+ +

+ Now all that's left is dropping a job into cron or + periodic to run certbot renew at least once or + twice within the renewal period. +

+ +
+
+macon% doas crontab -l|grep certbot
+# certbot renewal
+@monthly certbot renew
+
+	  
+ +

+ You can always test that your scripts are working with + certbot renew --dry-run just to be safe. +

+ +
+
+macon% doas certbot renew --dry-run
+Saving debug log to /var/log/letsencrypt/letsencrypt.log
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+Processing /usr/local/etc/letsencrypt/renewal/53hor.net.conf
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+Cert not due for renewal, but simulating renewal for dry run
+Plugins selected: Authenticator standalone, Installer None
+Simulating renewal of an existing certificate for 53hor.net and 7 more domains
+Performing the following challenges:
+http-01 challenge for 53hor.net
+http-01 challenge for carpentertutoring.com
+http-01 challenge for git.53hor.net
+http-01 challenge for nextcloud.53hor.net
+http-01 challenge for pkg.53hor.net
+http-01 challenge for plex.53hor.net
+http-01 challenge for theglassyladies.com
+http-01 challenge for www.53hor.net
+Waiting for verification...
+Cleaning up challenges
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+new certificate deployed without reload, fullchain is
+/usr/local/etc/letsencrypt/live/53hor.net/fullchain.pem
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+Congratulations, all simulated renewals succeeded:
+  /usr/local/etc/letsencrypt/live/53hor.net/fullchain.pem (success)
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+Running post-hook command: /usr/local/etc/letsencrypt/renewal-hooks/post/001-catcerts.sh
+Running post-hook command: /usr/local/etc/letsencrypt/renewal-hooks/post/002-haproxy.sh
+Output from post-hook command 002-haproxy.sh:
+Waiting for PIDS: 15191.
+Starting haproxy.
+
+
+		
+ +

+ And there it is. Automated Let's Encrypt certificate renewal on FreeBSD + with HAProxy. +

+
+ + diff --git a/posts/2021-04-20-how-to-make-your-website-boring-and-why.html b/posts/2021-04-20-how-to-make-your-website-boring-and-why.html new file mode 100644 index 0000000..d2f5d03 --- /dev/null +++ b/posts/2021-04-20-how-to-make-your-website-boring-and-why.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + + 53hornet ➙ How to Make Your Website Boring and Why! + + + + + +
+

How to Make Your Website Boring and Why!

+ +

+ I took the time last year to make my website more boring. Here's how you + can do the same and why you'd want to. +

+ +

+ Up until recently I was using a static site generator + (cobalt-rs) and a fancy CSS framework/library (Bulma) to + build my website. I also had one or two scripts to do various fiddly + things in the browser. I took the time to gut it and now I have a much + more boring website. I don't use anything but HTML to write all of the + posts and pages. This eliminated the need for a static generator or + script to turn something like Markdown into HTML for me. I also scrapped + all of the customized CSS framework style sheets that I had been using + for a very small (145 lines including whitespace and braces) single-file + stylesheet. I also dropped all of the fancy links, banners, most of the + icons, and any JavaScript that I had originally. Now, my site is much + more boring. And it's so much better. +

+ +

How does one make their website boring?

+ +

+ Typically, ask yourself whether you need something. If the answer is + "no", you can safely remove it and you won't need it again. Your website + will become more boring (read: simpler). Here are some of the things I + evaluated: +

+ + + +

+ Do you use a lot of third-party assets, templates, or CSS for your site? + Do you have to run a SASS tool to generate your stylesheets? Are your + stylesheets really big (> 1000 lines I think anyone would consider on + the bigger side)? Consider whether or not you really need them. + Oftentimes, with CSS, less is more. Especially if your site is just a + collection of pages of text with links to other pages of text. You can + make your site attractive and compatible with 100% of browsers by + keeping things simple. And then you don't have to worry about rebuilding + your output stylesheets or keeping up with libraries and frameworks. +

+ +

+ Do you have a lot of dynamically-generated content on your site? Does + the document need to change based on user input? Do you have a large + number of script tags importing minified files from third-party CDNs? + Odds are you don't need those either and you can completely get rid of + them. Now you don't have to worry about making sure all browsers can run + those scripts, or whether or not the CDNs are online, or you're + requesting the latest version. +

+ +

+ Do you use a static site generator to build your site? Is your content + complicated enough to write that you can't write it in plain HTML? Is + Markdown really easier or more powerful? Odds are, it's easier to write + directly in HTML without having to tell your generator what to do with + your tags. And for the oddball tag that Markdown doesn't directly + support, you might often end up writing HTML into your Markdown files + anyways. And, you can better control what the output formatting looks + like, making your site's code more readable. Furthermore, you won't have + two acting copies of your site, a pre- and post-generator one. For me, + it was annoying having "source code" for my web site that was different + from what I was actually hosting. It's so much nicer to have a 1:1 + mapping between what I write, test, and deploy. +

+ +

+ Still not convinced? Still need to automate some part of building your + site, like generating an RSS feed? Is there any chance you can write a + quick Makefile to do that for you? I was able to do just that, and it + was way nicer not having to install and learn how a generator worked to + automate assembling my site. +

+ +

+ If you answered "no" to any of the above "do you need"-s, you just found + a way to make your site more boring. Boring equates with simplicity. + Simplicity is a good thing. +

+ +

Why should you make your website boring simple?

+ +

+ Not relying on a bunch of libraries and assets is a good thing. It + seemed like every time I wanted to add a quick post, I would notice + there was an update for some library I was using and I was spending time + upgrading and learning about it. You know, that thing that computer + programmers enjoy doing and are good at but often doesn't actually help + them accomplish anything: fiddling with shiny new stuff that doesn't + solve a problem. Now I get to just focus on adding things to my site and + I'm never worried about whether it looks broken. +

+ +

+ I also didn't like having a pre- and post-build site. If I wanted to fix + one typo I couldn't remote into my live site, fix it, and then leave it + there. I had to do something like fix the typo in my Markdown, commit + and push it, and then re-run the generator and upload the new "live" + files. The generator step wasn't making things easier, it was making + them more annoying. +

+ +

+ You'd also be surprised at how easy it is to make your site fast and + reliable on all modern and old browsers when it's boring (read: simple, + again). Internet Explorer doesn't care about my site, it's a breeze to + render and there's nothing in it that hasn't been in existence for at + least a decade. (Alright, I do have a few SVG icons which it probably + wouldn't know what to do with. You can't tell the difference between + Firefox's and Chrome's renders of my site. And Google's PageSpeed + Insights score is a hilarious 99. +

+ +

+ My site is also more functional now. It's less distracting. It's really + easy to navigate and read. There's no runtime, no JavaScript that has to + execute before the reader sees the page they're looking for. And there's + practically nothing to maintain except my posts. It's also really easy + for crawlers to quickly ingest all of my posts and turn them into search + results. Hopefully, it's also easier for the visually impaired to zoom + in and not mess up the document, or use a screen reader that extracts + the article tags. +

+ +

+ The benefits are through the roof. My site used to be about tinkering + with tools and libraries and frameworks. Now it's just a boring website. + That leaves me with time to focus on tinkering with other stuff that's + more interesting, and only focus on writing when I'm working on this + site. So make your life easier and go make your website boring today. +

+
+ + diff --git a/posts/computing/2019-04-06-why-have-a-website-in-2019.html b/posts/computing/2019-04-06-why-have-a-website-in-2019.html deleted file mode 100644 index 7fb9b48..0000000 --- a/posts/computing/2019-04-06-why-have-a-website-in-2019.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Why Have a Web Site in 2019? - - - - - -
-

Why Have a Web Site in 2019?

-
- Adam, why on earth do you have a website? Wait... Is this a - blog? It's 2019, why don't you just use Facebook?! -
- -

- I've wanted to have my own website for a long time mostly because I like - playing with technology. I think it's cool that I can make a few files - on a computer in my closet available for the entire world to see. The - web has become a near-necessity in our daily lives and it's only been - around for a couple of decades. That has always fascinated me enough to - drive me to see if I can do it on my own. I started self-hosting my own - web server about a year ago now and it's been an awesome study in the - way all of the tech we use on the web works. -

- -

- A written website is also a good way to keep up on my writing skills. - I've graduated college and won't be writing essays for the foreseeable - eternity. Which is fine except that I have no reason to write creatively - or formally anymore. Having this site encourages me to continue turning - thoughts into words, even though it's more casual than a term paper. -

- -

- This extends into the professionalism of a personal website. Normally - you can't point your employer towards your Twitter profile as the - distillation of your online footprint. Having a website, especially one - that separates professional and personal interests, is ten times better - than a resume, especially in the world of technology. It lets you tell - people exactly who you are and what you do, without forcing them to - navigate through an auth wall or a bunch of puppy photos. Your - professional and personal lives don't bleed together quite as much and - it makes for a kick-ass business card. -

- -

- Most importantly however, I enjoy the level of control that I gain with - creating and operating my own website, something I have also sought for - a long time. In high school I set up an old Dell from my school's - recycling center with Windows XP and Microsoft Internet Information - Services. It didn't have SSL or even a domain name but it was reachable - over the WAN. I set up an upload system so that my friends and I could - 'post' memes and funny messages for each other on raw html pages written - with Microsoft Word. That was the extent of its functionality. It was - slow, insecure, and went offline every time the router got a new IP - assigned to it. But I didn't care. It was a site the school couldn't - block. It had no name and no rules and nobody could tell us what to do - with it because it was ours. And we called it the - Troll Nexus Center because that's what you do when you're 15 -

- -

- My reasons then for building the Troll Nexus Center still stand now. - Having your own website is having your own piece of internet - property. - I first heard this wording from - Luke Smith over on his YouTube channel - and it's one-hundred percent true. Tumblogs, Google Sites, Facebook - profiles, and GitHub Pages are all like renting an apartment. Sure, - there are some really nice apartments out there but it's not the same as - owning your own home. You have to pay rent obviously, and rent is - subject to change once your lease is up. If anything breaks you text - your landlord and wait to have it fixed. You aren't allowed to fix it - yourself and sometimes it doesn't get fixed at all. And of course you're - limited by how much you can customize things to your own liking. Whether - it's painting walls or knocking them down. -

- -

- These limitations may or may not apply to you. Whether you're paying for - storage, server space, metrics, or watching an ad every five seconds, - these services aren't free either. And you certainly can't fix - everything that goes wrong with them. I started on Google Sites. It's a - truly fantastic system. Building a site is like putting a PowerPoint - slide together. I just plain outgrew it. There were too many things I - wanted to do that I simply couldn't. I was also at the mercy of Google's - constant change. After I finished constructing my first site, Google - announced they would be shutting down the old Google Sites in favor - of an entirely new platform under the same name. Weeks of work got thrown out the window. You might also not care - about ads or customization. You may be intimidated by doing things - yourself and prefer that the landlord take care of everything. - Personally, I like the challenge and the craftsmanship that comes with - doing something myself. And I like being in total control of my server, - site, and content. Not from a tinfoil hat perspective but from a "gosh I - really wish I could just share more than 15 gigabytes of family video - with my relatives in New York and Ohio" perspective. -

- -

- So that's why I created my own website. If you want to know - how I host my own website, look for another post about my - server setup where I'll explain everything I'm hosting and how I got it - all hooked up. And that's a wrap. Now you know why I'm here instead of - somewhere else online. Sure, I do have Facebook and YouTube accounts but - I don't frequently update anything on either of them. This site is my - home online. It's where I keep all of my interests, hobbies, and - memories for sharing with others. -

- -

- Now you know where to find me. If you want to keep up with me, be - old-fashioned and subscribe to my RSS feed. -

-
- - diff --git a/posts/computing/2020-12-22-why-does-everyone-use-adobe-acrobat-reader.html b/posts/computing/2020-12-22-why-does-everyone-use-adobe-acrobat-reader.html deleted file mode 100644 index 81136e8..0000000 --- a/posts/computing/2020-12-22-why-does-everyone-use-adobe-acrobat-reader.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Why Does Everyone Use Adobe Acrobat [Reader]? - - - - - -
-

Why Does Everyone Use Adobe Acrobat [Reader]?

- -

- -

- -

- This is something that I've never been able to figure out. All through - high school I had to use PDFs. And if you wanted to open a PDF, everyone - understood that you needed Adobe Acrobat Reader. Even web sites where - you downloaded PDFs insisted that in order to open them, you were going - to have to follow a download link to make sure you have Acrobat on your - PC. -

- -

- Fast-forward a few years into college and I'm using PDFs more than ever. - Every professor ever is scanning and uploading course material, so out - comes Acrobat Reader for literally every teacher and student. At this - point I was actually used to using Firefox (PDF.js) to view PDFs for a - couple of reasons. First of all, Firefox usually opened PDFs faster than - Acrobat Reader did. Reader was getting bigger with every release, and - eventually had a monstrous UI to load up every time I wanted to open a - tiny PDF file. Second, Firefox had smooth scrolling for page-width - documents. Reader was getting slower and laggier with each release, to - the point where scrolling through a PDF was no longer buttery smooth but - jittery and stuttery. It also seemed like Reader purposefully wouldn't - slide the page when you used a mouse wheel. It would jump down a few - lines at a time like it was simulating the down arrow. -

- -

- By my senior year I had switched from Windows to Linux full-time and it - was then I found out about MuPDF and - from then on things were never the same. It's literally the best PDF - reader I've ever used, and I tried out quite a few. There are desktop - and mobile apps. It opens almost instantly. It lets you easily resize - the page with excellent keyboard shortcuts. There are no giant menu bars - on either side of the page to squish the document down to an unreadable - size. Having a dozen of them open at once doesn't bog down my PC. It's - also available for all of the relevant operating systems I've used - (Windows, Mac OS, Linux, FreeBSD)! Oh and password-protected PDFs are - supported as well. -

- -

- It's a fantastic piece of software And the best part is it comes with a - variety of tools to edit and manipulate PDFs as well. If the folks I - went to school with thought you needed the free Acrobat Reader to view a - PDF, they sure as heck thought you needed to buy Acrobat Pro to edit - one. Some of them refused to pay for it and used a variety of online - services to upload, split or merge, and download PDFs. I honestly for - the life of me can't understand why. MuPDF comes with - mutool, which does all of the things I would ever need to - do with a PDF. It can attempt to convert a PDF to other formats, like - HTML. It can split and combine documents. It can even create them from - scratch and sign them. -

- -

- It's also free and open source. Can you imagine that? PDF viewing and - editing being free and open source? It's AGPL (in addition to being - commercially) licensed by the creators. The only slight drawback is the - desktop version apparently does not yet let you fill out forms. Not sure - why but this isn't something I use very frequently. -

- -

- It's not the hottest piece of tech out there, but it just plain works - and works really well. Maybe the only reason more people I know don't - use it is because Adobe is synonymous with the PDF format. It doesn't - seem like that big of a deal, but I feel like Acrobat has always been a - piece of software that has frustrated new or infrequent users in - computing. And that's just not good. Maybe the barrier to using MuPDF is - the lack of GUI and abundance of keybindings, but for me that's no - sweat. I'd say to anyone to just try it out and see if they like it. It - is free, after all. -

-
- - diff --git a/posts/computing/2020-12-29-antivirus-software-is-a-hack.html b/posts/computing/2020-12-29-antivirus-software-is-a-hack.html deleted file mode 100644 index 9aec081..0000000 --- a/posts/computing/2020-12-29-antivirus-software-is-a-hack.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Antivirus Software is a Hack - - - - - -
-

Antivirus Software is a Hack

- -

- -

- -

- I read a really terrific article today about computer security and - really dumb ideas or trends that have developed in this field. It's - M. Ranum's The Six Dumbest Ideas in Computer Security, and I highly recommend reading through the whole thing. It's got - great anecdotes and really simple language for what I consider to be - some of the obvious issues with the way programmers and sysadmins think - about security (myself included). One portion of it (idea #2), however, - finally put something into words that I've felt for a really long time. - It enables me to explain why I think all antivirus software is a total - hack and is virtually useless. -

- -
- hack
- 1. n. Originally, a quick job that produces what is needed, but not - well. -
- -

- This is the Jargon File's definition of a hack. And to me, this is what - antivirus software is. Antivirus software, as I understand it, emerged - in the mid to late 1980s and became prolific in the 1990s. In the 2000s - it was considered an essential piece of software and people were paying - for yearly subscriptions for antivirus suites from Norton, Avast, and - McAfee. -

- -

- The most basic functionality of an antivirus program is to determine - whether malware exists on a host operating system. The typical method of - doing this is to use a collection of virus definitions and compare each - and every potentially-infected file with each and every definition to - determine whether the file is malware or has been infected by some. An - over-simplified way of implementing this is to store a collection of - hashes, each taken from a known potentially unwanted program or - infectious executable. You can then hash entire files or portions of - files and compare the checksums to see whether a file contains or is - equivalent to the definition, and is therefore infected and shouldn't be - executed. Some security suites go beyond this with heuristic matching, - but if you run an antivirus that has to "update definitions" on a - routine basis, it probably works something like this*. With any luck, it - does it without being a total detriment to system performance. Ideally - it also doesn't act like a piece of malware itself by making itself near - impossible to remove (looking at you, McAfee). -

- -

- To me, a virus definition database is "enumerating badness" (Ranum's - Dumb Idea #2). The premise is that it is not only logical but even - possible to compile a list of all potentially unwanted - programs, viruses, ransomware, and worms. An environment of trust should - be built around the programs that you want to run (read: - allow to run), not the other way around. Picture an operating - system where no binary file can be executed unless it is specifically - flagged as being allowed to. Oh and picture also being able to restrict - this execution to just the file's owner, or other groups of users. - Wouldn't it be easier to store the list of 30 odd programs that you and - other system users trust to be run than the thousands (millions?) of - programs that are infectious, forbidden, or unwanted? What about when - those trusted applications become compromised? Would it not also be - easier to maintain a list of checksums for those binaries and compare - those checksums before they're executed to make sure they haven't been - infected or replaced? -

- -

- The answer is yes, it would be easier. And yes, it is easier. Of course, - your system has to work that way. Antivirus software is a hack because - it's a hack-y solution to a problem that has a better, simpler solution. - It also has the potential for making a ton of money but I won't go into - that. It's easier to enumerate goodness, to specifically open up to a - select few trustworthy applications. Good lists are usually shorter than - bad lists. This builds on top of Ranum's Dumb Idea #1: Default Permit. - You wouldn't configure a firewall to just block some known bad ports and - traffic. You configure it to block all of it, and then whitelist the - ones you know you can trust. You wouldn't configure a browser ad-blocker - to permit all ads, and select the ones you don't want to see. You block - all of them! Then, if there are sites or ads you're okay with seeing, - you whitelist them. You shouldn't default permit all programs to be - given control over your computer, and then meticulously list the ones - that don't have that permission. -

- -

- Oh and of course, as always, there's free software that lets you do - this. You don't have to pay for an antivirus suite, or even use an - unpaid one that slows down your computer or barrages you with ads. On - the BSDs and virtually all Linux distributions, there are built-in tools - to control access and execution of binaries. There are additional tools - that you can install that check whether binaries (in locations like - /bin or /usr/local/bin have been modified - since you last used them. On Windows, the story is a little different. - Most home Windows 10 users are automatically allowed to install and run - any software they want to by default. Windows Server does have Software - Restriction Policies that allow you to create a "default deny" policy - and whitelist only the software that's allowed to run. If you're using a - home edition you probably have to look for software that lets you do - this. I haven't tried any of them so I'm not going to endorse or even - name them here. -

- -

- Preventing malware from running on your system is a problem. Solving - this problem is the right thing to do. But please, try to solve it the - right way. I stopped using an antivirus after I moved out and got to - control my own computer. I don't think it ever did me any good besides - flag false positives (a lot of the time with programs or applications - that I wrote, which weren't malicious in any way!) and grind my spinning - disk to a halt. Evaluate what software you use. Is most of it online? - Are there one or two applications that you know you need to use? How - often do you install and use unknown or untrusted software? Odds are you - can come up with a list of very few programs that you want or need to - use. If it's less than 100,000, you're probably better off with a - default deny policy than an antivirus suite. -

- -

- * What I didn't mention here is that as soon as a new piece of malware - is constructed, if it's different enough from its predecessors, it's - impervious to all antivirus suites on the planet that don't have it in - their definitions. So until that malware is used, detected, and added to - the list, it has free reign. -

-
- - diff --git a/posts/computing/2021-04-20-how-to-make-your-website-boring-and-why-.html b/posts/computing/2021-04-20-how-to-make-your-website-boring-and-why-.html deleted file mode 100644 index d2f5d03..0000000 --- a/posts/computing/2021-04-20-how-to-make-your-website-boring-and-why-.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ How to Make Your Website Boring and Why! - - - - - -
-

How to Make Your Website Boring and Why!

- -

- I took the time last year to make my website more boring. Here's how you - can do the same and why you'd want to. -

- -

- Up until recently I was using a static site generator - (cobalt-rs) and a fancy CSS framework/library (Bulma) to - build my website. I also had one or two scripts to do various fiddly - things in the browser. I took the time to gut it and now I have a much - more boring website. I don't use anything but HTML to write all of the - posts and pages. This eliminated the need for a static generator or - script to turn something like Markdown into HTML for me. I also scrapped - all of the customized CSS framework style sheets that I had been using - for a very small (145 lines including whitespace and braces) single-file - stylesheet. I also dropped all of the fancy links, banners, most of the - icons, and any JavaScript that I had originally. Now, my site is much - more boring. And it's so much better. -

- -

How does one make their website boring?

- -

- Typically, ask yourself whether you need something. If the answer is - "no", you can safely remove it and you won't need it again. Your website - will become more boring (read: simpler). Here are some of the things I - evaluated: -

- - - -

- Do you use a lot of third-party assets, templates, or CSS for your site? - Do you have to run a SASS tool to generate your stylesheets? Are your - stylesheets really big (> 1000 lines I think anyone would consider on - the bigger side)? Consider whether or not you really need them. - Oftentimes, with CSS, less is more. Especially if your site is just a - collection of pages of text with links to other pages of text. You can - make your site attractive and compatible with 100% of browsers by - keeping things simple. And then you don't have to worry about rebuilding - your output stylesheets or keeping up with libraries and frameworks. -

- -

- Do you have a lot of dynamically-generated content on your site? Does - the document need to change based on user input? Do you have a large - number of script tags importing minified files from third-party CDNs? - Odds are you don't need those either and you can completely get rid of - them. Now you don't have to worry about making sure all browsers can run - those scripts, or whether or not the CDNs are online, or you're - requesting the latest version. -

- -

- Do you use a static site generator to build your site? Is your content - complicated enough to write that you can't write it in plain HTML? Is - Markdown really easier or more powerful? Odds are, it's easier to write - directly in HTML without having to tell your generator what to do with - your tags. And for the oddball tag that Markdown doesn't directly - support, you might often end up writing HTML into your Markdown files - anyways. And, you can better control what the output formatting looks - like, making your site's code more readable. Furthermore, you won't have - two acting copies of your site, a pre- and post-generator one. For me, - it was annoying having "source code" for my web site that was different - from what I was actually hosting. It's so much nicer to have a 1:1 - mapping between what I write, test, and deploy. -

- -

- Still not convinced? Still need to automate some part of building your - site, like generating an RSS feed? Is there any chance you can write a - quick Makefile to do that for you? I was able to do just that, and it - was way nicer not having to install and learn how a generator worked to - automate assembling my site. -

- -

- If you answered "no" to any of the above "do you need"-s, you just found - a way to make your site more boring. Boring equates with simplicity. - Simplicity is a good thing. -

- -

Why should you make your website boring simple?

- -

- Not relying on a bunch of libraries and assets is a good thing. It - seemed like every time I wanted to add a quick post, I would notice - there was an update for some library I was using and I was spending time - upgrading and learning about it. You know, that thing that computer - programmers enjoy doing and are good at but often doesn't actually help - them accomplish anything: fiddling with shiny new stuff that doesn't - solve a problem. Now I get to just focus on adding things to my site and - I'm never worried about whether it looks broken. -

- -

- I also didn't like having a pre- and post-build site. If I wanted to fix - one typo I couldn't remote into my live site, fix it, and then leave it - there. I had to do something like fix the typo in my Markdown, commit - and push it, and then re-run the generator and upload the new "live" - files. The generator step wasn't making things easier, it was making - them more annoying. -

- -

- You'd also be surprised at how easy it is to make your site fast and - reliable on all modern and old browsers when it's boring (read: simple, - again). Internet Explorer doesn't care about my site, it's a breeze to - render and there's nothing in it that hasn't been in existence for at - least a decade. (Alright, I do have a few SVG icons which it probably - wouldn't know what to do with. You can't tell the difference between - Firefox's and Chrome's renders of my site. And Google's PageSpeed - Insights score is a hilarious 99. -

- -

- My site is also more functional now. It's less distracting. It's really - easy to navigate and read. There's no runtime, no JavaScript that has to - execute before the reader sees the page they're looking for. And there's - practically nothing to maintain except my posts. It's also really easy - for crawlers to quickly ingest all of my posts and turn them into search - results. Hopefully, it's also easier for the visually impaired to zoom - in and not mess up the document, or use a screen reader that extracts - the article tags. -

- -

- The benefits are through the roof. My site used to be about tinkering - with tools and libraries and frameworks. Now it's just a boring website. - That leaves me with time to focus on tinkering with other stuff that's - more interesting, and only focus on writing when I'm working on this - site. So make your life easier and go make your website boring today. -

-
- - diff --git a/posts/interesting/2020-11-30-titanic's-last-signals.html b/posts/interesting/2020-11-30-titanic's-last-signals.html deleted file mode 100644 index f4a610a..0000000 --- a/posts/interesting/2020-11-30-titanic's-last-signals.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Titanic's Last Signals - - - - - -
-

Titanic's Last Signals

-

- I forgot to post this back in April but 108 years ago, a chilling and - heroic conversation was had over the airwaves. This is a fascinating way - to hear the real conversations that took place the night the Titanic - went down with 1,496 souls. -

- -
- - diff --git a/posts/life/2019-07-21-dancing-the-shag-and-the-new-lion-king.html b/posts/life/2019-07-21-dancing-the-shag-and-the-new-lion-king.html deleted file mode 100644 index b8deca5..0000000 --- a/posts/life/2019-07-21-dancing-the-shag-and-the-new-lion-king.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Dancing the Shag & Two Left Feet - - - - - -
-

Dancing the Shag & Two Left Feet

-

- Not all of my posts are huge, and they probably shouldn't be. Amy and I - had a really great time yesterday at Two Left Feet Dance Studio, - learning more about how to dance the Carolina Shag in preparation for - our wedding (which is in less than 20 days)! An enormous swing band is - going to play all of our favorites from the brass band/swing era, and - one of the easiest dances to do to that music is the Shag. I wrote a - paper on the Shag a few years ago for school but never actually learned - how to do it. The steps are simple for us to remember and it's easy - enough to add flair or mix it up so we look like we know what we're - doing during our first dance. -

- -

- We also got out to see the new Lion King remake and I can honestly say - it was worth it. If anyone's a Lion King purist, it's Amy. It's easily - been her favorite movie since she was a toddler, and to see it - tastefully redone almost 25 years after it was first released was - thoroughly enjoyable. There were minor alterations to literal sentences - in the script that all added some context to things that were always - kind of assumed in the original (clarification on Scar's backstory, - etc.). I did however feel like they were trying to throw Beyonce lines - the way a middle-schooler tries to turn a 500-word paper into a 700-word - paper. Regardless, it's definitely re-living the classic, not re-hashing - it. -

-
- - diff --git a/posts/life/2019-07-28-i-finally-found-a-drink-i-like.html b/posts/life/2019-07-28-i-finally-found-a-drink-i-like.html deleted file mode 100644 index 6edd6ef..0000000 --- a/posts/life/2019-07-28-i-finally-found-a-drink-i-like.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Finally Found a Drink I Like - - - - - -
-

Finally Found a Drink I Like

-

- Anyone who knows me even slightly well probably knows that I don't - drink. And it's not out of moral obligation or anything like that. I - just plain can't stand the taste of alcohol. So it's no surprise that my - entire family has been trying to throw different alcoholic beverages in - my direction to see what sticks. -

- -

- But it finally happened! I finally found a drink with alcohol in it. And - not only did I not gag, but I genuinely enjoy it, think it tastes great, - and mix it myself. -

- -

- It's called Blackberry Cream Soda. It's just blackberries, - ginger ale, and spiced rum. It's darn good. And it's going to be the - signature drink at our wedding, whatever that means. All I know is I can - finally order something at a bar and that's cool by me. -

- -

- Behold, Blackberry Cream Soda -

-
- - diff --git a/posts/life/2019-08-11-marrying-my-best-friend.html b/posts/life/2019-08-11-marrying-my-best-friend.html deleted file mode 100644 index 9ac1153..0000000 --- a/posts/life/2019-08-11-marrying-my-best-friend.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ I Married My Best Friend! - - - - - -
-

I Married My Best Friend!

-

- It was an inexplicable mixture of joy and butterflies getting to marry - my best friend. It was truly like a dream come true, so much so that it - drove me to tears multiple times. Now that we're on our honeymoon, it - feels simultaneously like everything and nothing has changed but I think - that's a good thing. -

- -

More to come!

-
- - diff --git a/posts/life/2020-04-10-the-obligatory-covid-19-post.html b/posts/life/2020-04-10-the-obligatory-covid-19-post.html deleted file mode 100644 index 44f6fd0..0000000 --- a/posts/life/2020-04-10-the-obligatory-covid-19-post.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Obligatory COVID-19 Post - - - - - -
-

Obligatory COVID-19 Post

-

- We're alive! All three of us: Amy, Clementine, and myself. We're doing - what we do best and that is being hermits with zero social contact. - That's pretty okay by us though because it lets us slow down from all - the fast-paced life changes we've made in the past few months. -

- -

- In January Amy and I bought a house! We couldn't have done it without - the wonderful help of everyone who gave us wedding gifts. We got a nice - little standalone place in Suffolk, much closer to where I work and - centrally located for Amy's tutoring business. We spent all of January - painting and prepping for the big move. Late January and early February - were all moving and unpacking and trying to get back in the groove. - Since the outbreak, we've been using the extra time at home to finish up - all the move-in projects we wanted to: finishing painting, putting up - shelves, hanging pictures, and rewiring electrical outlets. -

- -

- Amy also finally got the chance to pursue her dream job: she started up - her own private tutoring business. She's been working hard with clients - all over Hampton Roads, from college students all the way to - first-graders. Business was booming before schools closed but I know - she'll bring it back once things have returned to normal again. No - worries though, she's spending this time helping William and Mary handle - remote operations and students in need. She's also [supposed to be] - writing her master's thesis so she can graduate in May but you know how - it is. -

- -

- We're also working through a family illness, which adds difficulty . We - expect a speedy recovery though and we're really excited for that. - All-in-all, we're really enjoying our lives as a happily married couple. - It's been about eight months now and I've enjoyed every minute of it: - the glad, the slightly stressed, and the overarching worry as the world - took a strange turn. But we're looking forward to a good Summer now. The - weather has turned nice -- really nice -- and Clementine is forcing us - to get outside. She's in love with her nice, big fenced-in yard and - refuses to come in after catching hoops most of the time. -

- -

Stay safe, smart, and sane!

-
- - diff --git a/posts/life/2020-04-10-wedding-photos-are-here.html b/posts/life/2020-04-10-wedding-photos-are-here.html deleted file mode 100644 index 20b5ccd..0000000 --- a/posts/life/2020-04-10-wedding-photos-are-here.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Wedding Photo Debacle - - - - - -
-

Wedding Photo Debacle

- -

- At long last we have all of our wedding photos together! Unfortunately a - large portion of the professional ones were lost during editing but - we're extremely fortunate to everyone who took pictures throughout the - festivities so we have more to share! We hope you enjoy flipping through - them as much as we did! There is also a collection of the photos we took - while we were on our honeymoon on Mackinac Island, MI. It was an - absolutely magical place and truly the experience of a lifetime for us - to run away there. We're in contact with our videographer, who's working - on the final cut now. -

- -

- Everything is available at the links down below. You can scroll through - the photos, view them in fullscreen, and even download them or share - them elsewhere. We hope you have as much fun flipping through them as we - did! -

- - -
- - diff --git a/posts/life/2021-01-15-adam-s-2020-reading-list.html b/posts/life/2021-01-15-adam-s-2020-reading-list.html deleted file mode 100644 index 639e384..0000000 --- a/posts/life/2021-01-15-adam-s-2020-reading-list.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Adam's 2020 Reading List - - - - - -
-

Adam's 2020 Quarantine Reading List

- - -
- - diff --git a/posts/life/2021-02-12-louis-vierne-is-a-bamf-and-proof-that-organists-are-metal-.html b/posts/life/2021-02-12-louis-vierne-is-a-bamf-and-proof-that-organists-are-metal-.html deleted file mode 100644 index 11ada08..0000000 --- a/posts/life/2021-02-12-louis-vierne-is-a-bamf-and-proof-that-organists-are-metal-.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - 53hornet ➙ Louis Vierne Is a BAMF (and Proof That Organists Are Metal) - - - - - - -
-

Louis Vierne Is a BAMF (and Proof That Organists Are Metal)

- -

- Louis Vierne is a certifiable badass organist from the end of the 19th - and early 20th centuries. He was born blind and had to have surgery to - be able to distinguish shapes and objects. Did that stop him from - playing the one instrument that literally requires you to distinguish - hundreds and hundreds of small objects from each other? Nope, he just - did it (and he learned from Cesar Franck, another great organist). -

- -

- In 1906 he got hit by a car and the doctors said they might have to - amputate his leg. Did you know you play an organ with both your hands - and both your feet? Well you do, and Vierne just re-learned how - to play with his feet after the accident. Because nobody tells Louis - Vierne no. -

- -

- And because he's a badass, Vierne went on to become the official - organist at the Notre Dame in Paris, a position he won by competitively - dunking on numerous other musicians. He considered this his greatest - achievement, and what Louis Vierne says goes. -

- -

- In one final act of badassery, he carried out his lifelong dream: to die - while playing at Notre Dame. In 1937, to a full recital hall in Notre - Dame, he was giving his 1,750th performance and actually - had a heart-attack while playing and died at the console, and keeled - over so that the low "E" played until they removed his body. To this day, no rock band has ever been so metal. -

- -
- -

- Alright, so without the decoration, Louis Vierne is my favorite Organist - and composer from the period. The organ is, in my opinion, the coolest - instrument on the planet. It's the biggest, the loudest, and the most - impressive. It's also got the most wide and interesting array of sounds, - like having an orchestra at your fingertips. Vierne made some of my - favorite music for the organ (music that my lowly organ skills will - never let me play). He's also, obviously, pretty badass. -

- -

- In truth, I think all organists are pretty cool. They play a cool, - complicated instrument that really sounds like no other. They also play - with their hands and their feet. Someone once said when a musician mates - with an octopus, an organist is born. Come to think of it, Davy Jones - plays the Organ and he's pretty cool. Coincidence? I think not. -

- -

- If you get the chance, give Vierne a listen, you can look up his work on - YouTube or a Pandora Radio station in his name. Look especially for - Symphony No. 1 for Organ in D Minor, Op. 14. That's the first song I - heard of his live (and in my understanding is the one he was playing - when he died). -

-
- - diff --git a/posts/programming/2020-07-11-why-computer-science-at-w-m.html b/posts/programming/2020-07-11-why-computer-science-at-w-m.html deleted file mode 100644 index 8933bcf..0000000 --- a/posts/programming/2020-07-11-why-computer-science-at-w-m.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Why Computer Science at William and Mary - - - - - -
-

Why Computer Science at William and Mary

- -

- Recently a rising high-school senior asked for input on what going to - the College of William and Mary was like for a Computer Science degree. - They were asking about the program itself as well as what it's like on - and off campus. Here's what I sent to them. -

- -

Quick Intro

- -

- I graduated with a Bachelor's in Computer Science from W&M in 2018. - I'm a couple years in the workforce now but can still remember my - experiences well enough to hopefully add my honest opinion on my time - there as well as how it prepared me for my career. I will also add a - little bit about my time on campus in a dorm and off-campus in Colonial - Williamsburg. -

- -

Courses and Curriculum

- -

- I felt very positively about the array of courses that were offered - while I was a student. I took a variety of core prerequisites, just like - everyone else, and a good mix of electives. The courses I took include - Data Structures and Algorithms, Software Development/Engineering, - Computer Organization/Architecture, UNIX Systems Programming, Computer - Graphics/Animation, and Computer and Network Security. This list is not - exhaustive and I'm sure they aren't all offered anymore. I was also - required to take a few math classes (Calc I, II, Discrete Math, Linear - Algebra, and Finite Automata). -

- -

- It is true that the courses listed at cs.wm.edu aren't all - offered at the same time. And it is also true that the higher-level - electives pretty much all required my core prerequisites to be - completed. The result is that the electives all came in my final two - years. My understanding is the curriculum is designed to give someone - the best possible background in computing as a whole. A lot of the - topics may seem like they would never be useful in the "real world" but - I have found the opposite is true. I am an application developer at a - three-letter company. My day-to-day work is building and debugging web - apps, but there's been a lot more to it than that. My first assignment - on the job was scraping bytes off a remote shell and writing a parser to - sift through them. The level of understanding I gathered from my core - classes helped more than I expected they would. I think as a whole they - give me an edge at work and help me teach my colleagues about - algorithms, performance, and systems administration. -

- -

- That being said, course registration was always nightmarish. It was very - difficult to get into the limited seats in the classes I was most - interested in. Eventually the heads of the department had to pass around - a sign up sheet and organize every student into courses, classrooms, and - professors so that seniors would graduate on time and we could all get - something on our schedules. I hope the shortage of teachers has - caught up since I graduated. I learned from a long-time faculty member - that this is largely a result of the exponential growth of incoming CS - degree-seekers. The program has grown very popular in the last ten years - and I like to think grads are catching on to that. -

- -

Teaching

- -

- CS@W&M had neutral to good instructors for me. Some were far worse - than others, as with all subjects. When I was there, lots of the older - faculty were retiring and quickly being replaced with younger, newer - instructors, which added to the growing pains of the program. The most - important thing again was making sure there were enough teachers to - teach all of the students. -

- -

- I know a few of my peers were very upset about what they described as a - lack of communication or availability from their professors. Some have - also mentioned they didn't like having to learn material on their own - and wanted more to come from instruction. I don't deny that the material - itself was difficult and there was a lot of hard work I had to do on my - own to understand very involved concepts in intense, fast-paced courses. - I think that hard work has paid off. I don't think there's realistically - anywhere someone can learn about computing where they won't do any - learning on their own. I am also a very visual, and hands-on learner so - I suppose your mileage may vary. -

- -

- The most important takeaway from this for me was the ability to pick up - new concepts and technologies quickly and apply them productively. The - majority of professors had project-driven courses. Lots of due dates - meant learning how to transform what I read or learned in class into - practical applications in short amounts of time. This has become, - according to those I work with, one of my greater assets. I am - constantly learning new things in my career and I don't have a lecturer - to explain things to me. It's very powerful to have that and I am - thankful for it. It also helps me teach that knowledge to my colleagues - so we can move faster as a team. -

- -

Campus

- -

- I agree with my peers about the conditions of classrooms and buildings - on campus. Some are old. I guess that comes with an old university but - there are a choice few that haven't been kept up as best they could. - Since CS is growing so fast it's also long outgrown its own offices. - Classrooms are scattered throughout every academic building on campus - and I probably had a CS course in at least 80% of them. That meant - jumping from one side of campus to another and back again in between - periods. -

- -

- The College itself isn't too sprawling. I am long-legged and I found I - could get from one end of campus to another in fifteen minutes on foot. - I rode bike a lot to get to classes where I only had ten minutes to do - it. It's also pretty marshy and woodsy in a lot of areas, so during the - rainy season some walking paths got muddy or flooded. Good boots - required. I have never been in as good shape as when I had to do all - that walking but I definitely got soaked and winded making those - transitions. -

- -

- I appreciate history and architecture and was drawn in by the look and - feel of William and Mary as a result. Without getting too romantic, it's - definitely a beautiful place to attend classes. The ancient Wren - building still holds classes and it's a monument to the College's - tradition. However, I really appreciated the modern academic buildings - on the other side of campus where all of the new construction was taking - place. Modern lab equipment and the library lived there. -

- -

- The dorms were nothing to write home about. Lots of them were nested in - the woods and built ages ago so they were a little tired and even dingy. - Others are brand new and well maintained; ask around and get opinions on - which ones to go for first chance you get. I made do with what I got for - the first couple of years by keeping it clean and decorated. My last two - years I lived in a couple of off-campus apartments. It was well worth - the switch. Depending on where you are on campus you may need at least a - bike to access local restaurants, shops, and the grocery store. A bike - is a good idea anyway but it's not necessary for every dorm. -

- -

Colonial Williamsburg

- -

- Lots of my peers didn't appreciate CW as a "college town" but I enjoyed - my time there. I can't speak about parties or clubbing, I was boring and - didn't do any of that. I made a great group of friends and we would walk - into town to get ice cream, see historical attractions (most of which - are free as a student, IIRC), and see movies or plays when we weren't - studying or playing video games in the dorm. There are some good, - sort-of-affordable restaurants but they're kind of driving distance. -

- -

- The best part about living there was meeting my wife. We would go on - long walks to get away from studying and wound up seeing - horse-and-carriages and the Governor's Palace and things like that. We - would also escape with her car to go to some of the surrounding towns to - get away to nice grocery stores and fun places to eat and explore on the - weekends. I also have family in the area so it was easy for me to stop - by home and say hi, although I know lots of students wanted to get as - far away from home as possible. -

- -

Parting Words

- -

- I don't consider myself a gung ho alumnus. There are lots of things I - think could be improved, both in CS and at W&M as a whole but I do - not regret my going there. There is no such thing as "everything is - great" or "everything is terrible". It's not so definitive. I had my - fair share of gripes and at times it strained me. There were pros and - cons but I think I have a lot to be thankful for (I landed my job - through W&M recruiting and the career center as well, which are - fantastic resources). I cannot say "do this instead of that." I haven't - gone to any other colleges and don't know enough about them to recommend - them as better or worse. What I can recommend is the same path I took - for folks who want to pursue a degree in Computer Science. I think - you'll come away from it all the more knowledgable, resourceful, and - dedicated. -

-
- - diff --git a/posts/programming/2020-11-24-i-like-hyper-more-than-actix.html b/posts/programming/2020-11-24-i-like-hyper-more-than-actix.html deleted file mode 100644 index 33c5d9e..0000000 --- a/posts/programming/2020-11-24-i-like-hyper-more-than-actix.html +++ /dev/null @@ -1,23 +0,0 @@ -

- I Like hyper more than - Actix Web -

- -
-

- I've been using Actix Web as the HTTP service layer for some web - applications for a while now. I've written several APIs for work and - personal projects on top of Actix and always thought it was pretty spiffy - for what it does: listen for HTTP requests and respond to them with code - I've written. I was always a little bummed about how large the dependency - tree was with the project though, and how long it took to compile. -

- -

- Recently I've been trying to write or depend on as little code as is - possible to get the job done, so I've been trying to take a look at whether - or not I - need what I've written or imported or even though of implementing - before I've written anything. -

-
diff --git a/posts/programming/2020-12-01-the-guides.html b/posts/programming/2020-12-01-the-guides.html deleted file mode 100644 index 48e2d79..0000000 --- a/posts/programming/2020-12-01-the-guides.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ [The Guides] - - - - - -
-

𝔗𝔥𝔢 𝔊𝔲𝔦𝔡𝔢𝔰

- -

- This is partly satirical and purposefully strange to be humorous. These - are my personal rules for software development (and other projects where - I get carried away easily). -

- -

The Guides. The Guiding Principles.

- -

- They guide you. They will not lead you astray. Obey The Guides. -

- -

- You've heard them go by different names. YAGNI. KISS. These are not - falsehoods, but they are not The Guides. Seek the wisdom of the - guides. -

- -
- 𝔗𝔥𝔬𝔲 𝔰𝔥𝔞𝔩𝔱 𝔴𝔯𝔦𝔱𝔢 𝔞𝔰 𝔩𝔦𝔱𝔱𝔩𝔢 𝔠𝔬𝔡𝔢 𝔞𝔰 𝔭𝔬𝔰𝔰𝔦𝔟𝔩𝔢 𝔱𝔬 𝔤𝔢𝔱 𝔱𝔥𝔢 𝔧𝔬𝔟 𝔡𝔬𝔫𝔢 𝔯𝔦𝔤𝔥𝔱. -
- -
- O Guides, may I please just add this one extra feature? It won't take me - long and it will be so nice to have later. -
- -
- 𝔗𝔥𝔬𝔲 𝔰𝔥𝔞𝔩𝔱 𝔴𝔯𝔦𝔱𝔢 𝖔𝖓𝖑𝖞 𝖙𝖍𝖊 𝖈𝖔𝖉𝖊 𝖓𝖊𝖈𝖊𝖘𝖘𝖆𝖗𝖞 𝔱𝔬 𝔤𝔢𝔱 𝔱𝔥𝔢 𝔧𝔬𝔟 𝔡𝔬𝔫𝔢 𝔯𝔦𝔤𝔥𝔱. -
- -
- O Guides, this can't be correct code. I haven't used proper software - development patterns, processes, or practices. -
- -
- 𝔓𝔞𝔱𝔱𝔢𝔯𝔫𝔰 𝔣𝔬𝔯 𝔱𝔥𝔢 𝔰𝔞𝔨𝔢 𝔬𝔣 𝔭𝔞𝔱𝔱𝔢𝔯𝔫𝔰 𝔞𝔯𝔢 𝔞𝔫𝔱𝔦-𝔭𝔞𝔱𝔱𝔢𝔯𝔫𝔰. -
- -
- O Guides, how may I approach this project pragmatically? -
- -
ℌ𝔢𝔢𝔡 𝔱𝔥𝔢𝔰𝔢 𝔯𝔲𝔩𝔢𝔰:
- -
    -
  1. - You may only write code directly related to the task at hand. Don't - get distracted. -
  2. -
  3. - Once you have working code, make it correct. Once it is correct, make - it secure. Once it is secure, make it small. Once it is small, stop. -
  4. -
  5. The enemy of good is better.
  6. -
-
- - diff --git a/posts/programming/2020-12-04-aoc-2020-day-1-in-cbm-basic.html b/posts/programming/2020-12-04-aoc-2020-day-1-in-cbm-basic.html deleted file mode 100644 index c59a893..0000000 --- a/posts/programming/2020-12-04-aoc-2020-day-1-in-cbm-basic.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ AOC 2020 Day 1 in CBM Basic - - - - - -
-

AOC 2020 Day 1 in CBM Basic

- -

- I implemented the - Advent of Code 2020 Day 1 - challenge in CBM BASIC on a real Commodore 64. I haven't done anything - in Basic in a long time, and probably never did anything actually - meaningful with it. Part 1 of the challenge was to take a list of - numbers, find the two that summed to 2020, and then multiply those two - numbers together. Part two was to perform part 1 but with three numbers - instead of two. -

-

- Now I wanted to actually write the code on the Commodore 64 itself, but - I gave myself some leniency. Instead of manually typing in all 200 - entries of input data (and inevitably making a breaking mistake) I used - Vim on my PC to format the DATA entries at the start of the - code. I then dropped that onto a 1541 disk image, plopped it on an SD - card, and used my SD2IEC to mount the SD card's image on the Commodore. - The rest of the programming was done on the Commodore itself. -

- -

Here is my solution for Day 1 Part 1:

-
-	  
-10 DATA 1686,  1983,  1801, 1890, 1910, 1722, 1571, 1952, 1602, 1551, 1144
-11 DATA 1208,  1335,  1914, 1656, 1515, 1600, 1520, 1683, 1679, 1800, 1889
-12 DATA 1717,  1592,  1617, 1756, 1646, 1596, 1874, 1595, 1660, 1748, 1946
-13 DATA 1734,  1852,  2006, 1685, 1668, 1607, 1677, 403 , 1312, 1828, 1627
-14 DATA 1925,  1657,  1536, 1522, 1557, 1636, 1586, 1654, 1541, 1363, 1844
-15 DATA 1951,  1765,  1872, 696,  1764, 1718, 1540, 1493, 1947, 1786, 1548
-16 DATA 1981,  1861,  1589, 1707, 1915, 1755, 1906, 1911, 1628, 1980, 1986
-17 DATA 1780,  1645,  741 , 1727, 524 , 1690, 1732, 1956, 1523, 1534, 1498
-18 DATA 1510,  372 ,  1777, 1585, 1614, 1712, 1650, 702 , 1773, 1713, 1797
-19 DATA 1691,  1758,  1973, 1560, 1615, 1933, 1281, 1899, 1845, 1752, 1542
-20 DATA 1694,  1950,  1879, 1684, 1809, 1988, 1978, 1843, 1730, 1377, 1507
-21 DATA 1506,  1566,  935 , 1851, 1995, 1796, 1900, 896 , 171,  1728, 1635
-22 DATA 1810,  2003,  1580, 1789, 1709, 2007, 1639, 1726, 1537, 1976, 1538
-23 DATA 1544,  1626,  1876, 1840, 1953, 1710, 1661, 1563, 1836, 1358, 1550
-24 DATA 1112,  1832,  1555, 1394, 1912, 1884, 1524, 1689, 1775, 1724, 1366
-25 DATA 1966,  1549,  1931, 1975, 1500, 1667, 1674, 1771, 1631, 1662, 1902
-26 DATA 1970,  1864,  2004, 2010, 504 , 1714, 1917, 1907, 1704, 1501, 1812
-27 DATA 1349,  1577,  1638, 1886, 1157, 1761, 1676, 1731, 2001, 1261, 1154
-28 DATA 1769,  1529
-100 DIM A(200)
-110 FOR I=0TO199
-120 READ A(I)
-140 NEXT
-150 FOR I=0TO199
-160 B=A(I)
-170 FOR J=0TO199
-180 IF I=J THEN 210
-190 C=A(J)
-200 IF B+C=2020 THEN PRINT "!",B,C,B*C:STOP
-210 NEXT J
-220 NEXT I 
-	  
- -

- I basically put all 200 numbers into data fields, and then defined an - array large enough to read them into with DIM. Then I - iterated over the array twice, checking each element against each other - element to see if they summed to 2020. If they did, I printed them both - and the product of the two found numbers and stopped further execution. -

-

- There weren't really any special tricks to this implementation except - remembering that I shouldn't be checking whether a number could sum to - 2020 with itself. -

- -

- Then I got to move onto Part 2, and this is where things got - interesting. Comparing any three numbers from the data meant the - cognitively easiest way to solve the problem was a triple loop. This of - course meant O(n^3) time, which the Commodore struggled - with. I waited about an hour before I decided I could optimize just a - little bit to speed up the search. -

- -

- I figured that for three numbers to sum to 2020, they all had to be - pretty small. Most likely they were most (if not all) three digits - instead of four. So I figured I could sort the entry data to make the - search finish probably near the start of the first layer of iteration. - Keep in mind I didn't want to pre-sort the data, I wanted the Commodore - to work with the same exact input set it had for Part 1. So I turned to - the simplest sorting algorithm I could remember: - bubble sort. -

- -

Here is my solution for Day 1 Part 2:

- -
-	  
-10 DATA 1686,  1983,  1801, 1890, 1910, 1722, 1571, 1952, 1602, 1551, 1144
-11 DATA 1208,  1335,  1914, 1656, 1515, 1600, 1520, 1683, 1679, 1800, 1889
-12 DATA 1717,  1592,  1617, 1756, 1646, 1596, 1874, 1595, 1660, 1748, 1946
-13 DATA 1734,  1852,  2006, 1685, 1668, 1607, 1677, 403 , 1312, 1828, 1627
-14 DATA 1925,  1657,  1536, 1522, 1557, 1636, 1586, 1654, 1541, 1363, 1844
-15 DATA 1951,  1765,  1872, 696,  1764, 1718, 1540, 1493, 1947, 1786, 1548
-16 DATA 1981,  1861,  1589, 1707, 1915, 1755, 1906, 1911, 1628, 1980, 1986
-17 DATA 1780,  1645,  741 , 1727, 524 , 1690, 1732, 1956, 1523, 1534, 1498
-18 DATA 1510,  372 ,  1777, 1585, 1614, 1712, 1650, 702 , 1773, 1713, 1797
-19 DATA 1691,  1758,  1973, 1560, 1615, 1933, 1281, 1899, 1845, 1752, 1542
-20 DATA 1694,  1950,  1879, 1684, 1809, 1988, 1978, 1843, 1730, 1377, 1507
-21 DATA 1506,  1566,  935 , 1851, 1995, 1796, 1900, 896 , 171,  1728, 1635
-22 DATA 1810,  2003,  1580, 1789, 1709, 2007, 1639, 1726, 1537, 1976, 1538
-23 DATA 1544,  1626,  1876, 1840, 1953, 1710, 1661, 1563, 1836, 1358, 1550
-24 DATA 1112,  1832,  1555, 1394, 1912, 1884, 1524, 1689, 1775, 1724, 1366
-25 DATA 1966,  1549,  1931, 1975, 1500, 1667, 1674, 1771, 1631, 1662, 1902
-26 DATA 1970,  1864,  2004, 2010, 504 , 1714, 1917, 1907, 1704, 1501, 1812
-27 DATA 1349,  1577,  1638, 1886, 1157, 1761, 1676, 1731, 2001, 1261, 1154
-28 DATA 1769,  1529
-100 DIM A(200)
-110 FOR I=0TO199
-120 READ A(I)
-140 NEXT
-141 GOSUB 300
-150 FOR I=0TO199
-160 B=A(I)
-170 FOR J=0TO199
-180 IF J=I THEN 250
-190 C=A(J)
-200 FOR K=0TO199
-210 IF K=I OR K=J THEN 240
-220 D=A(K)
-230 IF B+C+D=2020 THEN PRINT "!",B,C,D,B*C*D:STOP
-240 NEXT K
-250 NEXT J
-260 NEXT I
-300 REM BUBBLE SORT
-301 X=200
-310 N=200
-320 FOR I=0TON-2
-330 FOR J=0TON-I-2
-340 X=A(J):Y=A(J+1)
-350 IF X>Y THEN A(J)=Y:A(J+1)=X
-360 NEXT : NEXT
-370 RETURN 
-	  
-	  
- -

- I added a subroutine starting on line 300 to perform a basic bubble sort - on top of the original array of data. Now bubble sort isn't fast by any - means, but the Commodore was able to finish it in a couple of minutes. - And the results were worth it because the subsequent triple - FOR-loop completed in another few minutes. My instinct was - right and two of the solution numbers were triple-digit. -

- -

- So there you have it, Advent of Code 2020 Day 1 in Commodore 64 Basic - V2. You can run these samples on real hardware of course, or in an - emulator. You can also run them with the - cbmbasic - interpreter, which is a neat native C64 Basic interpreter for modern - architectures. (Oh and I tested my samples on cbmbasic and - they finished instantaneously. It helps to have a - thousands-of-times-faster processor.) -

- -

- I was going to keep going with the challenge and finish them all in CBM - basic for fun, but the Day 2 input data set was 1000 entries. No - problem, I can just read them from a SEQ file. The only - blocker I realized was the challenge requires string character counting, - which I don't think there's a function for in CBM basic. Maybe I have to - do a few PEEKs and POKEs to check memory - locations for ASCII/PETSCII character codes. Or I could just put it off - til next year :) -

-
- - diff --git a/posts/programming/2020-12-08-useful-sprint-planning-from-a-certified-scrum-master.html b/posts/programming/2020-12-08-useful-sprint-planning-from-a-certified-scrum-master.html deleted file mode 100644 index 0d5fffe..0000000 --- a/posts/programming/2020-12-08-useful-sprint-planning-from-a-certified-scrum-master.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - 53hornet ➙ Useful Sprint Planning from a Certified Scrum Master - - - - - - -
-

Useful Sprint Planning from a Certified Scrum Master

- -

- This is a small collection of sprint planning/story points allocation - tips and tricks that I use at work. They pretty much all come from our - in-house certified "Scrum Master". He's got much better experience than - I do with building a real working backlog of stories and planning - sprints based on those stories. That being said, any opinions here are - my own and I don't speak on his behalf. -

- -

Points as a Measure of Work

- -

- In my understanding, points are approximate measures of the amount of - work required to complete a given story or task. I do not think points - correlate to an exact measure of time. I use them to determine the size - of a task in relation to another task. For example, a simple-looking - task may be allocated 1 point. In reality this 1 point may take 1 minute - or 1 hour to complete. The time it takes is less important than the - ratio of time it takes in comparison to a second given task. Say the - second task appears to take twice as much time as the first (however - much time that may be). The second task would therefore get 2 points. -

- -

- Some teams have a special system for incrementing points. Our team uses - the - Fibonacci sequence of numbers. So the smallest amount that can be allocated to a story is 1. Then it - goes 2, 3, 5, 8, and so on and so forth. If a single story is going to - use up 8 points, you should probably take a look at breaking it up into - smaller tasks. A single story shouldn't take up almost half of your - allocated work for a sprint. -

- -

How Much is Enough?

-

- Our team aims for 10 points per 2-week per sprint. Simple enough for me, - but the hard part is determining how many points to allocate to a given - task. -

- -

- One thing I could never figure out is what the recommended starting - position for 1 point looks like. I'm sure this is something that comes - from experience, and our Scrum Master helped us out with that. -

- - - -

Prioritizing Work

- -

- I do not see points as indicative of the importance or priority of a - task or story. Just because one task will take longer to complete than - another does not mean it's more or less important to me. There should be - another method of gauging which stories should be taken off the backlog - first. For example, one story might depend on another. One might relate - to core functionality that a stakeholder has asked for. Another task - might be required to make code build because it solves some major - problem! -

- -

- To communicate how "important" a task is, every story we have is - prioritized something like this: -

-
    -
  1. Critical
  2. -
  3. Blocker
  4. -
  5. Highest
  6. -
  7. High
  8. -
  9. Medium
  10. -
  11. Low
  12. -
  13. Lowest
  14. -
- -

- Tasks that align with some long-term project that management is waiting - on are tagged "Highest". Stories that prevent lots of other stories from - being completed may be labeled "Blocker". -

- -

Sprint Planning/Backlog Refinement

- -

- With all that in mind, at the start of the sprint I now take about 10 - points worth of priority work off of the backlog. I'll work through it - the whole sprint through and then, ideally, it'll all be complete by the - end of the sprint. If I bit off more than I could chew and the sprint - ends before I'm finished, the incomplete work rolls over to the next - sprint and is the first to be completed. If I find I've finished - everything I had to work on and there are still a couple of days left in - the sprint, I'll take one or two small items off the backlog and work on - those. -

- -

Tools to Get the Job Done

- -

- Our team uses Jira at work, and I know some folks love it so much - they've paid for a personal license. It's a bit overkill for my personal - projects, so I've been using Nextcloud's Deck plugin. This is an okay - solution but it doesn't integrate very well with source code - repositories (although it can tie into a Nextcloud "project", or a - collection of related files open to a team). I'm spinning up a Gitea - server to replace my git-web server soon and this is one of - the reasons for that. Gitea has a GitHub-style issue tracker where you - can create issues of various kinds, assign them to users, reference - commits to the source, and create a Kanban-style board of issues that - are on the backlog, to-do, in-progress, or done. -

- -

- I'm still learning how to keep to a Scrum-like process of some kind, - because I do see the benefit of using such a system, especially in a - team. I'm definitely not an expert though so some of what I've got here - may change over time. Right now it's working well and that's good enough - for me. -

-
- - diff --git a/posts/programming/2021-01-28-undefined-javasript-is-undefined-.html b/posts/programming/2021-01-28-undefined-javasript-is-undefined-.html deleted file mode 100644 index e12203b..0000000 --- a/posts/programming/2021-01-28-undefined-javasript-is-undefined-.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Undefined? JavaSript Is Undefined. - - - - - -
-

Undefined? JavaSript Is Undefined.

- -

- So I've been working on a web app for my mom. Nothing too fancy, but - it's a store front for her glass art. It's an easy way for her to keep - track of inventory, update photos of her products, and for people to - shop and search and sort and browse through it. This backend is an HTTP - service written in Rust. The frontend is a Vue.js app. I've used Vue and - JavaScript many times before but I recently ran into an incredibly - strange bug. One that I would have hoped JavaScript would have some - guard against. But JavaScript is an undefined language. -

- -

- I have a small component that uses a file input to collect an image from - the user. Then I append that file to a FormData and set that FormData as - a Fetch API request body. So I've got fetch API sending - multipart/form-data across the network to my backend. Awesome! The - backend is supposed to take each field of the request, turn the chunks - into a single stream of binary data, and write them out to an image. - Everything on the front seems like it's working great, it fires off the - request and throws no errors. But then the backend only sees a few bytes - of this multi-megabyte image. Not awesome! short chunks on the back-end. - The array of data in the API is less than ten bytes long, when this is a - many-kilobyte file I'm trying to upload. -

- -

- At this point I'm relentlessly debugging, trying to find out what's - wrong with the API. Why is it truncating the request down to a few - bytes, where's the rest of the data? It took me forever to actually - inspect what those few bytes are and, lo and behold they're ASCII for - undefined The request happily stringified an - undefined object, instead of maybe throwing a null - reference or undefined error during request creation because that's just - what JavaScript does. The linter didn't even catch it. -

- -

- You can see what the debugging logs looked like on the backend below. - Note that the &data is the field that spells out - "undefined". Also note that the file picker/FormData was constructed - alright because the key for the image name is correct. -

- -
-		
-[src/handlers.rs:114] &field =
-Field: application/octet-stream
-  boundary: ---------------------------175314640631070190963311652907
-  headers:
-    "content-disposition": "form-data; name=\"clu.jpg\""
-
-[src/handlers.rs:119] &chunk = Ok(
-    b"undefined",
-)
-[src/handlers.rs:123] &data = [
-    117,
-    110,
-    100,
-    101,
-    102,
-    105,
-    110,
-    101,
-    100,
-]
-ImageWrite("The image format could not be determined")
-		
-	
- -

- The working JS is here (it was late at night and I was so - donion rings I just fixed it and pushed it without saving the errors for - posterity): -

- -
-	  
-let file = event.target.files[0];
-if (!file) {
-	return;
-}
-
-const fd = new FormData();
-fd.append(file.name, file);
-
-const response = await fetch("http://localhost:8000/photos", {
-	method: "POST",
-	body: fd
-});
-
-console.log(response);
-	  
-	  
-

- I've gotten frustrated by JS before but not like this. I don't know if - TypeScript would have solved this issue but writing in a language that - gets transpiled back into the language I'm trying to avoid doesn't seem - like the way forward. I'm looking forward to Web Assembly as a way of - using more type-safe languages in the browser. -

-
- - diff --git a/posts/unix/2019-07-04-the-best-way-to-transfer-gopro-files-with-linux.html b/posts/unix/2019-07-04-the-best-way-to-transfer-gopro-files-with-linux.html deleted file mode 100644 index bbe5b28..0000000 --- a/posts/unix/2019-07-04-the-best-way-to-transfer-gopro-files-with-linux.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Offloading GoPro Footage the Easy Way! - - - - - -
-

Offloading GoPro Footage the Easy Way!

- -

- Transferring files off of most cameras to a Linux computer isn't all - that difficult. The exception is my GoPro Hero 4 Black. For 4th of July - week I took a bunch of video with the GoPro, approximately 20 MP4 files, - about 3GB each. The annoying thing about the GoPro's USB interface is - you need additional software to download everything through the cable. - The camera doesn't just show up as a USB filesystem that you can mount. - The GoPro does have a micro-SD card but I was away from home and didn't - have any dongles or adapters. Both of these solutions also mean taking - the camera out of its waterproof case and off of its mount. So here's - what I did. -

- -

- GoPro cameras, after the Hero 3, can open up an ad-hoc wireless network - that lets you browse the GoPro's onboard files through an HTTP server. - This means you can open your browser and scroll through the files on the - camera at an intranet address, 10.5.5.9, and download them - one by one by clicking every link on every page. If you have a lot of - footage on there it kinda sucks. So, I opened up the manual for - wget. I'm sure you could get really fancy with some of the - options but the only thing I cared about was downloading every single - MP4 video off of the camera, automatically. I did not want to download - any of the small video formats or actual HTML files. Here's what I used: -

- -
-        
-sh wget --recursive --accept "*.MP4" http://10.5.5.9:8080/
-		
-      
- -

- This tells wget to download all of the files at the GoPro's - address recursively and skips any that don't have the MP4 extension. Now - I've got a directory tree with all of my videos in it. And the best part - is I didn't have to install the dinky GoPro app on my laptop. Hopefully - this helps if you're looking for an easy way to migrate lots of footage - without manually clicking through the web interface or installing - additional software. The only downside is if you're moving a whole lot - of footage, it's not nearly as quick as just moving files off the SD - card. So I'd shoot for using the adapter to read off the card first and - only use this if that's not an option, such as when the camera is - mounted and you don't want to move it. -

- -

Some things I would like to change/add:

- - - -

- I could probably write a quick and dirty shell script to do all of this - for me but I use the camera so infrequently that it's probably not even - worth it. -

-
- - diff --git a/posts/unix/2019-09-28-my-preferred-method-for-data-recovery.html b/posts/unix/2019-09-28-my-preferred-method-for-data-recovery.html deleted file mode 100644 index 9751eda..0000000 --- a/posts/unix/2019-09-28-my-preferred-method-for-data-recovery.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ How I Do Data Recovery - - - - - -
-

How I Do Data Recovery

- -

- This week Amy plugged in her flash drive to discover that there were no - files on it. Weeks before there had been dozens of large cuts of footage - that she needed to edit down for work. Hours of recordings were - seemingly gone. And the most annoying part was the drive had worked - perfectly on several other occasions. Just not now that the footage was - actually needed of course. Initially it looked like everything had been - wiped clean, however both Amy's Mac and her PC thought the drive was - half full. It's overall capacity was 64GB but it showed only about 36GB - free. So there still had to be data on there if we could find the right - tool to salvage it. -

- -

- Luckily this wasn't the first time I had to recover accidentally (or - magically) deleted files. I had previously done so with some success at - my tech support job, for some college friends, and for my in-laws' - retired laptops. So I had a pretty clear idea of what to expect. The - only trick was finding a tool that knew what files it was looking for. - The camera that took the video clips was a Sony and apparently they - record into m2ts files, which are kind of a unique format - in that they only show up on Blu-Ray discs and Sony camcorders. Enter my - favorite two tools for dealing with potentially-destroyed data: - ddrescue and photorec. -

- -

DDRescue

- -

- ddrescue is a godsend of a tool. If you've ever used - dd before, forget about it. Use ddrescue. You - might as well alias dd=ddrescue because it's that great. By - default it has a plethora of additional options, displays the progress - as it works, recovers and retries in the event of I/O errors, and does - everything that good old dd can do. It's particularly good - at protecting partitions or disks that have been corrupted or damaged by - rescuing undamaged portions first. Oh, and have you ever had to cancel a - dd operation? Did I mention that ddrescue can - pause and resume operations? It's that good. -

- -

PhotoRec

- -

- photorec is probably the best missing file recovery tool - I've ever used in my entire life. And I've used quite a few. I've never - had as good results as I've had with photorec with other - tools like Recuva et. al. And photorec isn't just for - photos, it can recover documents (a la Office suite), music, images, - config files, and videos (including the very odd - m2ts format!). The other nice thing is - photorec will work on just about any source. It's also free - software which makes me wonder why there are like $50 recovery tools for - Windows that look super sketchy. -

- -

In Practice

- -

- So here's what I did to get Amy's files back. Luckily she didn't write - anything out to the drive afterward so the chances (I thought) were - pretty good that I would get something back. The first thing I - always do is make a full image of whatever media I'm trying to recover - from. I do this for a couple of reasons. First of all it's a backup. If - something goes wrong during recovery I don't have to worry about the - original, fragile media being damaged or wiped. Furthermore, I can work - with multiple copies at a time. If it's a large image that means - multiple tools or even multiple PCs can work on it at once. It's also - just plain faster working off a disk image than a measly flash drive. So - I used ddrescue to make an image of Amy's drive. -

- -

-$ sudo ddrescue /dev/sdb1 amy-lexar.dd
-GNU ddrescue 1.24
-Press Ctrl-C to interrupt
-     ipos:   54198 kB, non-trimmed:        0 B,  current rate:   7864 kB/s
-     opos:   54198 kB, non-scraped:        0 B,  average rate:  18066 kB/s
-non-tried:   63967 MB,  bad-sector:        0 B,    error rate:       0 B/s
-  rescued:   54198 kB,   bad areas:        0,        run time:          2s
-pct rescued:    0.08%, read errors:        0,  remaining time:         59m
-                              time since last successful read:         n/a
-Copying non-tried blocks... Pass 1 (forwards)
-	  
- -

- The result was a very large partition image that I could fearlessly play - around with. -

- -
-		
-$ ll amy-lexar.dd
--rw-r--r-- 1 root root 60G Sep 24 02:45 amy-lexar.dd
-        
-	  
- -

- Then I could run photorec on the image. This brings up a - TUI with all of the listed media that I can try and recover from. -

- -

-$ sudo photorec amy-lexar.dd
-
-PhotoRec 7.0, Data Recovery Utility, April 2015
-http://www.cgsecurity.org
-
-  PhotoRec is free software, and
-comes with ABSOLUTELY NO WARRANTY.
-
-Select a media (use Arrow keys, then press Enter):
->Disk amy-lexar.dd - 64 GB / 59 GiB (RO)
-
->[Proceed ]  [  Quit  ]
-
-Note:
-Disk capacity must be correctly detected for a successful recovery.
-If a disk listed above has incorrect size, check HD jumper settings, BIOS
-detection, and install the latest OS patches and disk drivers.
-	  
- -

- After hitting proceed photorec asks if you want to scan - just a particular partition or the whole disk (if you made a whole disk - image). I can usually get away with just selecting the partition I know - the files are on and starting a search. -

- -

-PhotoRec 7.0, Data Recovery Utility, April 2015
-http://www.cgsecurity.org
-
-Disk amy-lexar.dd - 64 GB / 59 GiB (RO)
-
-     Partition                  Start        End    Size in sectors
-      Unknown                  0   0  1  7783 139  4  125042656 [Whole disk]
->   P FAT32                    0   0  1  7783 139  4  125042656 [NO NAME]
-
->[ Search ]  [Options ]  [File Opt]  [  Quit  ]
-                              Start file recovery
-	  
- -

- Then photorec asks a couple of questions about the - formatting of the media. It can usually figure them out all by itself so - I just use the default options unless it's way out in left field. -

- -

-PhotoRec 7.0, Data Recovery Utility, April 2015
-http://www.cgsecurity.org
-
-   P FAT32                    0   0  1  7783 139  4  125042656 [NO NAME]
-
-To recover lost files, PhotoRec need to know the filesystem type where the
-file were stored:
- [ ext2/ext3 ] ext2/ext3/ext4 filesystem
->[ Other     ] FAT/NTFS/HFS+/ReiserFS/...
-	  
- -

- Now this menu is where I don't just go with the default path. - photorec will offer to search just unallocated space or the - entire partition. I always go for the whole partition here; sometimes - I'll get back files that I didn't really care about but more often than - not I end up rescuing more data this way. In this scenario searching - just unallocated space found no files at all. So I told - photorec to search everything. -

- -

-PhotoRec 7.0, Data Recovery Utility, April 2015
-http://www.cgsecurity.org
-
-   P FAT32                    0   0  1  7783 139  4  125042656 [NO NAME]
-
-
-Please choose if all space need to be analysed:
- [   Free    ] Scan for file from FAT32 unallocated space only
->[   Whole   ] Extract files from whole partition
-	  
- -

- Now it'll ask where you want to save any files it finds. I threw them - all into a directory under home that I could zip up and send to Amy's - Mac later. -

- -

-PhotoRec 7.0, Data Recovery Utility, April 2015
-
-Please select a destination to save the recovered files.
-Do not choose to write the files to the same partition they were stored on.
-Keys: Arrow keys to select another directory
-      C when the destination is correct
-      Q to quit
-Directory /home/adam
- drwx------  1000  1000      4096 28-Sep-2019 12:10 .
- drwxr-xr-x     0     0      4096 26-Jan-2019 15:32 ..
->drwxr-xr-x  1000  1000      4096 28-Sep-2019 12:10 amy-lexar-recovery
-	  
- -

- And then just press C. photrec will start - copying all of the files it finds into that directory. It reports what - kinds of files it found and how many it was able to locate. I was able - to recover all of Amy's lost footage this way, past, along with some - straggler files that had been on the drive at one point. This has worked - for me many times in the past, both on newer devices like flash drives - and on super old, sketchy IDE hard drives. I probably won't ever pay for - data recovery unless a drive has been physically damaged in some way. In - other words, this software works great for me and I don't foresee the - need for anything else out there. It's simple to use and is typically - pretty reliable. -

-
- - diff --git a/posts/unix/2020-07-26-now-this-is-a-minimal-install.html b/posts/unix/2020-07-26-now-this-is-a-minimal-install.html deleted file mode 100644 index 64652a7..0000000 --- a/posts/unix/2020-07-26-now-this-is-a-minimal-install.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Now This is a Minimal Install! - - - - - -
-

Now This is a Minimal Install!

- -

- I just got done configuring Poudriere on Freebsd 12.1-RELEASE. The - awesome thing about it is it allows you to configure and maintain your - own package repository. All of the ports and their dependencies are - built from source with personalized options. That means that I can - maintain my own repo of just the packages I need with just the - compile-time options I need. For example, for the Nvidia driver set I - disabled all Wayland related flags. I use Xorg so there was no need to - have that functionality built in. -

- -

- Compile times are pretty long but I hope to change that by upgrading my - home server to FreeBSD as well (from Ubuntu Server). Then I can - configure poudriere to serve up a ports tree and my own pkg repo from - there. The server is a lot faster than my laptop and will build packages - way faster, and I'll be able to use those packages on both the server - and my laptop and any jails I have running. Jails (and ZFS) also make - poudriere really cool to use as all of the building is done inside a - jail. When the time comes I can just remove the jail and poudriere ports - tree from my laptop and update pkg to point to my web server. -

- -

- This is, as I understand it, the sane way to do package management in - FreeBSD. The binary package repo is basically the ports tree - pre-assembled with default options. Sometimes those packages are - compiled without functionality that most users don't need. In those - situations, you're forced to use ports. The trouble is you're not really - supposed to mix ports and binary packages. The reason, again as I - understand it, is because ports are updated more frequently. So binary - packages and ports can have different dependency versions, which can - sometimes break compatibility on an upgrade. Most FreeBSD users - recommend installing everything with ports (which is just a make install - inside the local tree) but then you lose the package management features - that come with pkg. Poudriere lets you kind of do both by creating your - "own personal binary repo" out of a list of preconfigured, pre-built - ports. -

- -

FreeBSD rocks.

-
- - diff --git a/posts/unix/2021-01-15-root-on-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html b/posts/unix/2021-01-15-root-on-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html deleted file mode 100644 index 6f515f3..0000000 --- a/posts/unix/2021-01-15-root-on-zfs-a-zpool-of-mirror-vdevs-the-easy-way.html +++ /dev/null @@ -1,375 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Root on ZFS: A ZPool of Mirror VDEVs The Easy Way - - - - - -
-

Root on ZFS: A ZPool of Mirror VDEVs

- -

- I wanted/needed to make a root on ZFS pool out of multiple mirror VDEVs, - and since I'm not a ZFS expert, I took a little shortcut. -

- -

- I recently got a new-to-me server (yay!) and I wanted to do a - root-on-ZFS setup on it. I've really enjoyed using ZFS for my data - storage pools for a long time. I've also enjoyed the extra functionality - that comes with having a bootable system installed on ZFS on my laptop - and decided with this upgrade it's time to do the same on my server. - Historically I've used RAIDZ for my storage pools. RAIDZ functions - almost like a RAID10 but at the ZFS level. It gives you parity so that a - certain number of disks can die from your pool and you won't lose any - data. It does have a few tradeoffs however*, and for personal - preferences I've decided that for the future I would like to have a - single ZPool over top of multiple mirror VDEVs. In other words, my main - root+storage pool will be made up of two-disk mirrors and can be - expanded to include any number of new mirrors I can fit into the - machine. -

- -

- This did present some complications. First of all, - bsdinstall won't set this up for you automatically (and - sure enough, - in the handbook - it mentions the guided root on ZFS tool will only create a single, - top-level VDEV unless it's a stripe). It will happily let you use RAIDZ - for your ZROOT but not the more custom approach I'm taking. I did - however use - bsdinstall as a shortcut so I wouldn't have to do all of - the partitioning and pool setup manually, and that's what I'm going to - document below. Because I'm totally going to forget how this works the - next time I have to do it. -

- -

- In my scenario I have an eight-slot, hot-swappable PERC H310 controller - that's configured for AHCI passthrough. In other words, all FreeBSD sees - is as many disks as I have plugged into the backplane. I'm going to fill - it with 6x2TB hard disks which, as I said before, I want to act as three - mirrors (two disks each) in a single, bootable, growable ZPool. For - starters, I shoved the FreeBSD installer on a flash drive and booted - from it. I followed all of the regular steps (setting hostname, getting - online, etc.) until I got to the guided root on ZFS disk partitioning - setup. -

- -

- Now here's where I'm going to take the first step on my shortcut. Since - there is no option to create the pool of arbitrary mirrors I'm just - going to create a pool from a single mirror VDEV of two disks. Later I - will expand the pool to include the other two mirrors I had intended - for. My selections were as follows: -

- - - -

- Everything else was left as a default. Then I followed the installer to - completion. At the end, when it asked if I wanted to drop into a shell - to do more to the installation, I did. -

- -

- The installer created the following disk layout for the two disks that I - selected. -

- -
-
-atc@macon:~ % gpart show
-=>        40  3907029088  mfisyspd0  GPT  (1.8T)
-          40      409600          1  efi  (200M)
-      409640        2008             - free -  (1.0M)
-      411648     8388608          2  freebsd-swap  (4.0G)
-     8800256  3898228736          3  freebsd-zfs  (1.8T)
-  3907028992         136             - free -  (68K)
-
-=>        40  3907029088  mfisyspd1  GPT  (1.8T)
-          40      409600          1  efi  (200M)
-      409640        2008             - free -  (1.0M)
-      411648     8388608          2  freebsd-swap  (4.0G)
-     8800256  3898228736          3  freebsd-zfs  (1.8T)
-  3907028992         136             - free -  (68K)
-
-
- -

- The installer also created the following ZPool from my single mirror - VDEV. -

- -
-
-atc@macon:~ % zpool status
-  pool: zroot
- state: ONLINE
-  scan: none requested
-config:
-
-	NAME             STATE     READ WRITE CKSUM
-	zroot            ONLINE       0     0     0
-	  mirror-0       ONLINE       0     0     0
-	    mfisyspd0p3  ONLINE       0     0     0
-	    mfisyspd1p3  ONLINE       0     0     0
-
-errors: No known data errors
-
-
- -

- There are a couple of things to take note of here. First of all, - both disks in the bootable ZPool have an EFI boot partition. - That means they're both a part of (or capable of?) booting the pool. - Second, they both have some swap space. Finally, they both have a third - partition which is dedicated to ZFS data, and that partition is what got - added to my VDEV. -

- -

- So where do I go from here? I was tempted to just - zpool add mirror ... ... and just add my other disks to the - pool (actually, I did do this but it rendered the volume - unbootable for a very important reason), but then I wouldn't have those - all-important boot partitions (using whole-disk mirror VDEVS). Instead, - I need to manually go back and re-partition four disks exactly like the - first two. Or, since all I want is two more of what's already been done, - I can just clone the partitions using gpart backup and - restore! Easy! Here's what I did for all four remaining - disks: -

- -
-
-root@macon:~ # gpart backup mfisyspd0 | gpart restore -F mfisyspd2`
-
-
- -

- Full disclosure, I didn't even think of this as a possibility - until I read this Stack Exchange post. This gave me a disk layout like this: -

- -
-
-atc@macon:~ % gpart show
-=>        40  3907029088  mfisyspd0  GPT  (1.8T)
-          40      409600          1  efi  (200M)
-      409640        2008             - free -  (1.0M)
-      411648     8388608          2  freebsd-swap  (4.0G)
-     8800256  3898228736          3  freebsd-zfs  (1.8T)
-  3907028992         136             - free -  (68K)
-
-=>        40  3907029088  mfisyspd1  GPT  (1.8T)
-          40      409600          1  efi  (200M)
-      409640        2008             - free -  (1.0M)
-      411648     8388608          2  freebsd-swap  (4.0G)
-     8800256  3898228736          3  freebsd-zfs  (1.8T)
-  3907028992         136             - free -  (68K)
-
-=>        40  3907029088  mfisyspd2  GPT  (1.8T)
-          40      409600          1  efi  (200M)
-      409640        2008             - free -  (1.0M)
-      411648     8388608          2  freebsd-swap  (4.0G)
-     8800256  3898228736          3  freebsd-zfs  (1.8T)
-  3907028992         136             - free -  (68K)
-
-=>        40  3907029088  mfisyspd3  GPT  (1.8T)
-          40      409600          1  efi  (200M)
-      409640        2008             - free -  (1.0M)
-      411648     8388608          2  freebsd-swap  (4.0G)
-     8800256  3898228736          3  freebsd-zfs  (1.8T)
-  3907028992         136             - free -  (68K)
-
-=>        40  3907029088  mfisyspd4  GPT  (1.8T)
-          40      409600          1  efi  (200M)
-      409640        2008             - free -  (1.0M)
-      411648     8388608          2  freebsd-swap  (4.0G)
-     8800256  3898228736          3  freebsd-zfs  (1.8T)
-  3907028992         136             - free -  (68K)
-
-=>        40  3907029088  mfisyspd5  GPT  (1.8T)
-          40      409600          1  efi  (200M)
-      409640        2008             - free -  (1.0M)
-      411648     8388608          2  freebsd-swap  (4.0G)
-     8800256  3898228736          3  freebsd-zfs  (1.8T)
-  3907028992         136             - free -  (68K)
-
-
- -

- And to be fair, this makes a lot of logical sense. You don't want a - six-disk pool to only be bootable by two of the disks or you're - defeating some of the purposes of redundancy. So now I can extend my - ZPool to include those last four disks. -

- -

- This next step may or may not be a requirement. I wanted to overwrite - where I assumed any old ZFS/ZPool metadata might be on my four new - disks. This could just be for nothing and I admit that, but I've run - into trouble in the past where a ZPool wasn't properly - exported/destroyed before the drives were removed for another purpose - and when you use those drives in future - zpool imports, you can see both the new and the old, failed - pools. And, in the previous step I cloned an old ZFS partition many - times! So I did a small dd on the remaining disks to help - me sleep at night: -

- -
-
-root@macon:~ # dd if=/dev/zero of=/dev/mfisyspd2 bs=1M count=100
-
-
- -

- One final, precautionary step is to write the EFI boot loader to the new - disks. In - zpool admin handbook - it mentions you should do this any time you replace a zroot - device, so I'll do it just for safe measure on all four additional - disks: -

- -
-
-root@macon:~ # gpart bootcode -p /boot/boot1.efifat -i 1 mfisyspd2
-
-
- -

- Don't forget that the command is different for UEFI and a traditional - BIOS. And finally, I can add my new VDEVs: -

- -
-
-root@macon:~ # zpool zroot add mirror mfisyspd2p3 mfisyspd3p3
-root@macon:~ # zpool zroot add mirror mfisyspd4p3 mfisyspd5p3
-
-
- -

And now my pool looks like this:

- -
-
-atc@macon:~ % zpool status
-  pool: zroot
- state: ONLINE
-  scan: none requested
-config:
-
-	NAME             STATE     READ WRITE CKSUM
-	zroot            ONLINE       0     0     0
-	  mirror-0       ONLINE       0     0     0
-	    mfisyspd0p3  ONLINE       0     0     0
-	    mfisyspd1p3  ONLINE       0     0     0
-	  mirror-1       ONLINE       0     0     0
-	    mfisyspd2p3  ONLINE       0     0     0
-	    mfisyspd3p3  ONLINE       0     0     0
-	  mirror-2       ONLINE       0     0     0
-	    mfisyspd4p3  ONLINE       0     0     0
-	    mfisyspd5p3  ONLINE       0     0     0
-
-errors: No known data errors
-
-
- -

- Boom. A growable, bootable zroot ZPool. Is it easier than just - configuring the partitions and root on ZFS by hand? Probably not for a - BSD veteran. But since I'm a BSD layman, this is something I can live - with pretty easily. At least until this becomes an option in - bsdintall maybe? At least now I can add as many more - mirrors as I can fit into my system. And it's just as easy to replace - them. This is better for me than my previous RAIDZ, where I would have - to destroy and re-create the pool in order to add more disks to the - VDEV. Now I just create another little mirror and grow the pool and all - of my filesystems just see more storage. And of course, having ZFS for - all of my data makes it super easy to create filesystems on the fly, - compress or quota them, and take snapshots (including the live ZROOT!) - and send those snapshots over the network. Pretty awesome. -

- -

- * I'm not going to explain why here, but - this is a pretty well thought out article - that should give you an idea about the pros and cons of RAIDZ versus - mirror VDEVs so you can draw your own conclusions. -

-
- - diff --git a/posts/unix/2021-03-19-how-to-automate-certbot-renewal-with-haproxy.html b/posts/unix/2021-03-19-how-to-automate-certbot-renewal-with-haproxy.html deleted file mode 100644 index 634530b..0000000 --- a/posts/unix/2021-03-19-how-to-automate-certbot-renewal-with-haproxy.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ How to Automate Certbot Renewal with HAProxy - - - - - -
-

How to Automate Certbot Renewal with HAProxy

- -

- So this is specifically for HAProxy on FreeBSD, but it should apply to - other *nix systems as well. Basically, I use HAProxy as a reverse proxy - to a bunch of servers I administer. I use Let's Encrypt for a - certificate and I used certbot to generate that - certificate. Generating the certificate for the first time is easy and - has lots of documentation, but it wasn't initially clear on how I could - easily set up auto-renewal. Here's how I did it. -

- -

- If you've already set up TLS termination with HAProxy and - certbot, you know you need to combine your Let's Encrypt - fullchain and private key to get a combined certificate that HAProxy can - use. You can do this by cat-ing the chain and key together - like so: -

- -
-
-cat /usr/local/etc/letsencrypt/live/$SITE/fullchain.pem /usr/local/etc/letsencrypt/live/$SITE/privkey.pem > /usr/local/etc/ssl/haproxy.pem
-
-	  
- -

- In this example, $SITE is your domain name that you fed - HAProxy when you created the certificate and haproxy.pem is - wherever you're storing HAProxy's combined certificate. Your HAProxy - config then points to that certificate like this: -

- -
-
-macon% grep crt /usr/local/etc/haproxy.conf
-        bind *:443 ssl crt /usr/local/etc/ssl/haproxy.pem
-
-	  
- -

- And that was the end of the first-time setup. Then a few months later - you probably had to do it again because Let's Encrypt certs are only - good for 90 days in between renewals. To renew the certificate, you - usually run certbot renew, it detects which certificates - are present, and uses either the webroot or standlone server renewal - process. Then you have to cat the fullchain and privkey - together and restart HAProxy so it starts using the new certificate. -

- -

- To automate those steps, newer versions of - certbot will run any post renewal hooks (read: scripts) - that you want. You can also configure HAProxy and - certbot to perform the ACME challenge dance for renewal so - that you don't have to use it interactively. -

- -

- First, if you haven't already done it, change your HAProxy config so - there's a frontend+backend for responding to ACME challenges. In a - frontend listening for requests, create an access control list for any - request looking for /.well-known/acme-challenge/. Send - those requests to a backend server with an unused local port. -

- -
-
-frontend http-in
-		acl letsencrypt-acl path_beg /.well-known/acme-challenge/
-        use_backend letsencrypt-backend if letsencrypt-acl
-		...
-backend letsencrypt-backend
-		server letsencrypt 127.0.0.1:54321
-
-	  
- -

- What this will do is allow certbot and Let's Encrypt to - renew your server in standalone mode via your reverse proxy. As an added - bonus it prevents you from having to open up an additional port on your - firewall. -

- -

- Now you've gotta configure certbot to do just that. A - config file was created in certbot's - renew directory for your site. All you need to do in that - file is add a line to the [renewalparams] section - specifying the port you're using in your HAProxy config. -

- -
-
-macon% echo "http01_port = 54321" >> /usr/local/etc/letsencrypt/renewal/$SITE.conf
-
-	  
- -

- Now you need the post-renewal hooks. I dropped two separate scripts into - the renewal-hooks directory: one does the job of combining - the certificate chain and private key and the other just restarts - HAProxy. -

- -
-
-macon% cat /usr/local/etc/letsencrypt/renewal-hooks/post/001-catcerts.sh
-#!/bin/sh
-
-SITE=(your site of course)
-
-cd /usr/local/etc/letsencrypt/live/$SITE
-cat fullchain.pem privkey.pem > /usr/local/etc/ssl/haproxy.pem
-macon% cat /usr/local/etc/letsencrypt/renewal-hooks/post/002-haproxy.sh
-#!/bin/sh
-service haproxy restart
-
-	  
- -

- When certbot renew is run, certbot checks the - renewal-hooks/post directory and runs any executable things - in it after it's renewed the certificate(s). As a side note, - make sure you hit those scripts with chmod +x or - they probably won't run. -

- -

- Now all that's left is dropping a job into cron or - periodic to run certbot renew at least once or - twice within the renewal period. -

- -
-
-macon% doas crontab -l|grep certbot
-# certbot renewal
-@monthly certbot renew
-
-	  
- -

- You can always test that your scripts are working with - certbot renew --dry-run just to be safe. -

- -
-
-macon% doas certbot renew --dry-run
-Saving debug log to /var/log/letsencrypt/letsencrypt.log
-
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Processing /usr/local/etc/letsencrypt/renewal/53hor.net.conf
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Cert not due for renewal, but simulating renewal for dry run
-Plugins selected: Authenticator standalone, Installer None
-Simulating renewal of an existing certificate for 53hor.net and 7 more domains
-Performing the following challenges:
-http-01 challenge for 53hor.net
-http-01 challenge for carpentertutoring.com
-http-01 challenge for git.53hor.net
-http-01 challenge for nextcloud.53hor.net
-http-01 challenge for pkg.53hor.net
-http-01 challenge for plex.53hor.net
-http-01 challenge for theglassyladies.com
-http-01 challenge for www.53hor.net
-Waiting for verification...
-Cleaning up challenges
-
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-new certificate deployed without reload, fullchain is
-/usr/local/etc/letsencrypt/live/53hor.net/fullchain.pem
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Congratulations, all simulated renewals succeeded:
-  /usr/local/etc/letsencrypt/live/53hor.net/fullchain.pem (success)
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Running post-hook command: /usr/local/etc/letsencrypt/renewal-hooks/post/001-catcerts.sh
-Running post-hook command: /usr/local/etc/letsencrypt/renewal-hooks/post/002-haproxy.sh
-Output from post-hook command 002-haproxy.sh:
-Waiting for PIDS: 15191.
-Starting haproxy.
-
-
-		
- -

- And there it is. Automated Let's Encrypt certificate renewal on FreeBSD - with HAProxy. -

-
- - diff --git a/posts/wheels/2019-06-07-how-to-start-and-drive-a-hudson-hornet.html b/posts/wheels/2019-06-07-how-to-start-and-drive-a-hudson-hornet.html deleted file mode 100644 index 9224534..0000000 --- a/posts/wheels/2019-06-07-how-to-start-and-drive-a-hudson-hornet.html +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ How to Start and Drive a Hudson Hornet - - - - - -
-

How to Start and Drive a Hudson Hornet

- -

- My understanding is there are a lot of people out there for whom driving - a car from the mid-20th century is an oddity, a curiosity, or a life - experience they can't relate to. This is for the non-experts, and - non-Hudsonites to get an idea of what it's like. -

- -

- There are some significant differences between driving the Hornet and - most other cars you come across today. Some of them are just because - there are sixty-six years between the Hudson and the 2019 model year. - Others are Hudson-specific. Many people who I've talked to have said - that they would feel intimidated driving my car (whether that's because - of its perceived complexity or obvious value to me). So, for those who - just want to know how it's done: here is how you start and drive a - Hudson Hornet. -

- -

The Gauge Cluster, Switches, and Controls

- -

- Open the door, slide onto the bench seat, and sit behind the [massive] - steering wheel. For those who haven't experienced it before, it feels - like you have a whole lot of room at your disposal, almost like there - should be more matter occupying the space around you. In front - of you is probably the shiniest dashboard you've ever seen. It's simple, - and probably slightly familiar. -

-

From left to right above the steering wheel you have:

- - -

From left to right under the steering wheel you have:

- - -

- Also, underneath the dashboard on the left there is a parking brake - handle and hood latch release and on the right there is an arm which - raises and lowers the fresh air cowl vent. Think of it as "recirculate" - in more modern vehicles. If you're looking for the turn signal lever - it's the tiny stick to the left of the steering wheel. The indicator is - the little yellow light on the far left of the dash. There's only one so - it flashes when you're signalling left or right. We also added our own - air conditioning system, something Hudsons never came with from the - factory. -

- -

Dual-Range Hydramatic

- -

- The first thing that might confuse some folks when they first see the - car running is the shift lever. Many Hornets came with three-speed - manual transmissions that were shifted from the column (overdrive was an - option). However, lots of owners paid extra for the optional "Dual-range - Hydramatic", a fully automatic transmission from General Motors. Truly, - this car has a 4-speed automatic that requires no manual shifting during - normal use, making it that much easier to take a boatload of people to - get milkshakes. -

- -

- Behind the steering wheel is a shift indicator that deviates from the - "PRNDL" pattern most folks are familiar with. From left to right (shift - arm fully at the top to arm fully towards the bottom), the 'gears' are: -

- - -

- Neutral isn't just a mid-way point between reverse and drive in this - car. It's a necessity. With automatic Hornets (and Hydramatics in - general), neutral is used to start the car. There is an electric lockout - preventing the car from being started in any gear but neutral, so you do - have to put the car in neutral before you turn the key (if you're on a - hill put your foot on the brake or engage the parking brake). -

- -

- Drive is split into 4-Dr and 3-Dr, which basically decides whether the - transmission utilizes high gear. In the owner's manual, Hudson - recommends using 3-Dr for driving around town (as the low RPMs delivered - by high gear means unnecessary shifting in and out of 4th gear) and 4-Dr - for highway driving. It really depends on what speed you're going to be - driving at but there isn't anything wrong with driving around in 4 all - the time. I typically leave it in 4th at sustained speeds above 45MPH. - You can switch between these gears any time while moving. -

- -

- Low gear basically locks the transmission in 2nd gear so you don't spin - the wheels. The owner's manual says this is for pulling out of sand or - dirt if you get stuck. -

- -

- Reverse works just about how you might expect but with an added catch: - if the engine is off it acts as park. That's right. When you turn the - car off you can put it in reverse and the transmission will engage a - lock pin to prevent the car from rolling. You can't start the car in - this gear because of the lockout however so you have to shift into - neutral to start the car. So for starting, put it in neutral, for - stopping, put it in reverse. -

- -

Choke and Gas

- -

- For cold starts, our Hornet (and I believe this was common for other - Hudsons of the time) is equipped with an automatic 2-stage choke. Push - the pedal all the way to the floor once to set the choke. After the car - has started and has warmed up, kick the gas quickly to the floor and - release to cancel the choke. -

- -

- For warm starts the engine doesn't need the choke but likes to be given - just a little bit of gas while cranking. -

- -

The Keys, Ignition, and Warning Lights

- -

- Hudsons like mine come with two keys. The octagonal one is for starting - the car, it's used in the ignition. The round one is used for the door - and trunk locks (and I believe in my case the glove box). My - understanding is this is actually reversed from the majority of Hudsons - and is due to a locksmith error at one point or another. -

- -

- The ignition switch sits so that the teeth of the key enter vertically. - Turning the key left powers accessories like the radio. Turning the key - right once switches the car to "ON" which will allow the engine to be - started and remain running. -

- -

- Here's where some things may vary depending on the year of the car. For - '51 Hornets, there's a separate starter button located all the way on - the left control pod. For these cars, you put the key in and turn it to - "ON", and then press and hold the button until the car has started up. - For '52 Hornets onwards, the ignition switch also activates the starter - if you turn the key past "ON" (like in most modern vehicles). -

- -

- If you turn the key to "ON" you'll see two red warning lights appear on - the dash next to the indicators marked "AMP" and "OIL". These are - [alternator] charging status and oil pressure status lights. Our car is - equipped with a 12-V alternator system so the AMP light really comes on - if there is low voltage while the oil pressure light comes on when - there's low oil pressure. These lights will only appear with engine off, - key "ON" or if something has gone very wrong. -

- -

Starting and Driving

- -

- So now that I've gone over the basics of all the components, here is the - normal starting procedure. It actually varies depending on whether the - engine has been warmed up. That's life with carburetors. -

- -

From cold:

- - - -

From warm:

- - - -

Stopping and Parking

- - - -

- Note: I usually engage the parking brake AND put the car in reverse, - just to be safe. If you had to pick one however I would use the - transmission in case you're on a steep hill and your brakes fail for - whatever reason. -

- -

- And there you have it! Not much is different from most cars around today - but there are one or two quirks (more about old cars than about Hudsons - in particular). The only major thing to keep track of while driving is - that you have no power steering, so get ready to anticipate turns sooner - and use more of the wheel with every turn. -

-
- - diff --git a/posts/wheels/2019-07-04-yabs-yet-another-bad-shop.html b/posts/wheels/2019-07-04-yabs-yet-another-bad-shop.html deleted file mode 100644 index b0707e1..0000000 --- a/posts/wheels/2019-07-04-yabs-yet-another-bad-shop.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ YABS: Yet Another Bad Shop - - - - - -
-

YABS: Yet Another Bad Shop

-

- Today I received a text message from a local mechanic/auto shop asking - me to leave them a Google review. It was an automated message from a - shop that I know well and have used many times in the past. - Unfortunately, I have had several poor experiences (at the time they - seemed horrific) with them in the past year and I can honestly say - they'll never receive my business again. Now I could have used this as - an opportunity to leave them an anonymous nasty-gram but instead I'm - going to do the opposite. I'm going to write about everything I don't - like about them without telling you who they are or hiding who I am. Why - would I do that? Well for one, they were an excellent shop for many - years. I believe a recent change in management is to blame and I'm not - going to ruin their chances of making a comeback (because frankly I - would like for them to rebound). And secondly, I don't believe in - hiding. This page and its author are public knowledge. Now, in no - particular order: a sample of awful work from yet another bad shop. -

- -

Mom's Truck -- Balls Out

- -

- Mom's truck is a 2007 Chrysler Aspen that she loves very much. Dad does - a whole lot of work on it himself (the both of us do pretty much - everything we can in-house so long as we have the right equipment). - We've been taking her truck into this shop for years because we've found - them to be reliable, efficient, and economical. As I said before, at - some point in their recent history they changed hands -- either - ownership or management, I can't remember which. It was around this time - that Dad decided to overhaul Mom's front suspension. He replaced the - ball joints, tie rod ends, and a few other worn out parts. He then did - his own best-guess front-end alignment, but left everything loose so - that YABS could finish up the alignment and tighten everything. Now read - that again because it's important. Dad did his own alignment in our - driveway (as a cost-saving measure), got it decently close, but then - instructed this shop to finish the job and tighten everything up. -

- -

- Now here's where things fall apart. This shop full of professional - mechanics took one look at the alignment Dad did and decided it was good - enough. Hooray for Dad and supernatural mechanical skills, but the shop - didn't even touch the car. They called Dad back to come pick up the car, - telling him it was already good to go. They never tightened a thing, - even after Dad explicitly told them everything was loose and needed to - be tightened but they didn't to touch a thing. So what happened? Dad - picked up the car assuming everything was A-OK and Mom drove the car for - about a week before the two front tires wore down so badly they had to - be replaced immediately. Everything fell out of alignment as things - loosened further and further and the tires wore unevenly until they - ripped themselves to shreds. The worst part? These weren't tires with 6+ - years on them. These were brand new tires. So YABS got to install two - more front tires and then tighten everything. They did not cover the - costs, presumably because it was Dad who had done the alignment. Strike - one. -

- -

Friend's Minivan -- Crude Necessities

- -

- A good friend of ours drives a 2005-2006 Chrysler Town and Country. It - was actually Mom's car before upgrading to the Aspen (the minivan was - perfect in every way but it couldn't tow). Our friend has been using - YABS for just a long as we have. Once again, things started getting - kinda strange after several years of good service. She started getting - charged extra for simple repairs she had them doing very consistently. - They also started tacking on extra items for routine jobs. She would go - in for an inspection and they would claim she needed a new Part X. Now - this in and of itself isn't an uncommon or even strange request to make. - As cars age they need things and sometimes you don't know what they need - until you visit a professional mechanic. They remember the things you - forget about. -

- -

- One day they did all the forgetting, and they forgot a pretty important, - nay, crucial engine component: motor oil. Our friend took her minivan - into YABS for a routine oil change. Good diligence on her part. And - she's not the type to do that change on her own. She's too old to get - under a car anyway (no offense!). So she took the van to YABS and they - did a job they've done thousands of times: drain oil, replaced the - filter, and gave her back the car. Easy peasy right? Now I know I'm not - a professional but I'm thinking someone might have wanted to - double-check that several quarts of synthetic had left the shop shelf - and gone into the car they just backed out of the bay door. Now this - part of the story I'm a little fuzzy on so take it with a large, heaping - grain of salt, but I can say for a fact that they failed to - completely refill the engine oil before returning her car. - Supposedly there was enough in there such that the minivan survived long - enough for them to realize it before she drove off. -

- -

Monty, My 2013 Ford Focus -- Nut Allergy

- -

- I decided to give YABS another try after a long leave of absence. I - needed new tires all around for my daily driver. I also needed an - inspection and an alignment. A simple set of tasks for any shop (you see - where this is going). I initially tried to go to another local shop but - they were all out of the tires I was looking to get so I caved and went - to YABS. About halfway through the job they gave me a call and told me - they had some bad news. They said that there were some issues getting - the lug nuts off my wheels and that they had all been stripped, warped, - or otherwise destroyed in the process. They told me the only fix was to - get new ones from a supplier in town for about $160. Keep in mind the - entire job (inspection, tires, etc.) was going to cost $650. - Furthermore, dad and I had no problem getting those lug nuts off and - back on again just a few weeks prior when we changed the transmission - fluid. -

- -

- They didn't have an explanation that I could reconcile with. Joe Schmo - over the phone told me this is typical of Fords and Chryslers these days - and that they'd like to keep my lug nuts for a class action lawsuit - they're participating in. Now why on Earth would any sane mechanic, with - full knowledge they are dealing with a defective set of lug nuts, take a - high power impact wrench to those wheels without speaking with the owner - about it first? Smelled fishy to me honestly. But what was I gonna do? - Dad went out and grabbed twenty new lug nuts for cheaper than they - wanted to sell them for. -

- -

- Oh the tires were Cooper GTs by the way and they're amazing. They're - smooth and quiet and came with a very nice warranty. They're also made - in the USA, which is very important to me. 10/10 would recommend. -

- -

Ol' Blue -- Tunnel Vision

- -

- This was the real kicker. And this one doesn't really have any trailing - narrative. I got four new tires on Ol' Blue, my 1953 Hudson Hornet. They - were delivered to our house: four brand new Diamond Back wide white wall - radials. Super nice tires, with a super nice road hazard warranty (as a - side note I totally recommend you - check out Diamond Back's website if - you're looking for white wall radials). So we brought the car to YABS - with the new tires and asked them to mount them on the car. -

- -

- When we went to pick up the car everything looked great and I drove off. - I made it all the way to the Monitor Merrimack Memorial Bridge Tunnel - before I heard a loud rattling and a bang. I looked in the rear-view - mirror and swore I could see my precious hubcap rolling off to eternity. - When they replaced the hubcaps they didn't fully press one of them on. - And it's not that difficult. These hub caps are very secure when pressed - on the rim, we've never had problems with them. Oh and we're talking - about Hudson hubcaps that came with the car, and aren't super easy to - find. And I couldn't stop to get out and grab it because I was right at - the mouth of the tunnel. We went back later to try and see it but we - couldn't. And it was probably destroyed getting thrown from the car - anyways. -

- -

- The worst part is, the hubcap took a chunk out of my white wall on its - way out from under the wheel skirt. So the day I got the tires I had to - take a picture and redeem my road hazard warranty. Luckily, Diamond Back - were true to their word and sent me a new one no questions asked. The - beat up tire is now my spare. -

- -

Not All Bad

- -

- Like I said before, YABS used to be a very nice shop with friendly - people that did good work. And they didn't charge exorbitant prices for - their work. Times have changed, and I believe management has as well. - I've stopped visiting their shop completely. I found a new one that I - trust and will be taking all of my cars to. They've already done a - safety inspection on Ol' Blue and didn't put up a fuss. They're clean - and friendly and don't seem to be out to screw me. But as with - everything else, your mileage may vary. -

-
- - diff --git a/posts/wheels/2019-08-30-keep-right-except-to-pass.html b/posts/wheels/2019-08-30-keep-right-except-to-pass.html deleted file mode 100644 index 8fe960c..0000000 --- a/posts/wheels/2019-08-30-keep-right-except-to-pass.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - 53hornet ➙ Left Lane is for Passing, Not Cruising - - - - - -
-

Left Lane is for Passing, Not Cruising

- -

- Greetings fellow drivers of Hampton Roads. You may have noticed a new - sign on I264 today that befuddled or confused you. It went something - along the lines of -

- -
LEFT LANE IS FOR PASSING NOT CRUISING
- -

- Believe it or not this has been the law throughout Virginia for years - (read about it here - and - here). The law states you keep right except while passing. In most other - states things work this way but in Virginia, especially around here, the - left lane is treated as a moving, cruising lane. If you're in the left - lane and you've completed a pass please be mindful of the cars behind - you and move back over into the right-hand lane(s) so that other drivers - can do the same. -

- -

- It's really nice when this is practiced (like I said, I've experienced - it in other states) because you can easily move over when there are slow - vehicles ahead and then continue on your merry way. It reduces - congestion and prevents people from having to pass in the right lane, - which is both annoying and dangerous. Especially since this is typically - the lane cars from entrance and exit ramps are merging with. -

- -

- Don't forget too that it isn't rude or road-rage-y for someone behind - you to honk their horn or flash their lights if you're moving too slowly - in the passing lane. This is a perfectly polite request to pass you. You - don't set or enforce the speed limit. The correct (and legal) thing to - do, believe it or not, is to move over and slow down to let them pass - you. It's all about safe and sane driving etiquette. If you aren't - actively passing other cars, move on over to the right. It goes a long - way. -

-
- - -- cgit v1.2.3