Tag: Frugality

Home Cooking

Home Cooking

Decent lighting is essential when wanting to exude professionalism in a video call. But sometimes you either don’t have equipment at hand or don’t want to mess with it. As a stopgap, I’ve discovered that if I open up a few browser windows with light backgrounds they can help illuminate my face, but the results are a bit bluer than I’d otherwise prefer.

It got me thinking if I could build a simple website that would be nothing but an adjustable color background. Behold, the webcam light tool. Not only is the color adjustable via HSL (hue, saturation, lightness) sliders, there’s also a slider in Kelvin if you want to pick a color temperature instead. Color values are saved to browser local storage and remember on subsequent visits, and automatically synchronize in real-time if you open multiple windows.

With a pair of tall and narrow windows, one on either edge of my ultrawide monitor, the results are pretty good. Chalk one up for creative solutions!

A Helpful Transmogrifier

A Helpful Transmogrifier

Have a large CSV file and want a quick way to query it? Consider transforming it into a SQLite database. It’s easy! One command will do it:

$ sqlite3 "$sqlite_filename" ".import $csv_filename $table_name --csv"

Here’s a concrete example using airtravel.csv:

$ sqlite3 air.db ".import airtravel.csv air --csv"
$ sqlite3 air.db "SELECT * FROM air WHERE air.Month = 'JAN'"
JAN|  340|  360|  417

Neato! Admittedly the handling of headers and column names isn’t great, but that can be solved with a bit more script-fu (which I’ll leave as an exercise for the reader).

Garbage In, Garbage Out

Garbage In, Garbage Out

I try to put as much code as I can on Github, as an exercise in learning in public. Over the holiday I published something new: a Lambda function deployed with CDK that is called when events fire from Buy Me A Coffee. It’s notable for a couple reasons:

  • First, if you haven’t noticed, there’s now a little orange icon down in the lower right of this blog. If you’ve benefited from my writings here, and are feeling generous, you can buy me a coffee using that icon. No pressure, though!
  • Second, I wanted a permanent reference repo for doing a basic Lambda deployment with CDK, and now I have one.
  • Finally, and most interestingly, my first draft of this code (both the CDK and the function itself) was written by ChatGPT.

As I’ve been reflecting on what artificial intelligence means for the future software engineering, I doubt it’s going to obviate the need for understanding code. What I do think it will be able to do is produce workable drafts, getting maybe half-way to a workable solution, with developers making revisions to get it across the finish line.

If I’m right about that, software professionals are going to need to tweak their skill sets to be less like writers and more like editors. Few developers I know are particularly adept at reading code, though it’s a shortcut for leveling up coding skill. Software is an oddball in that respect: in most other creative domains, one must study the work of the geniuses who came before, but we don’t typically train coders that way. Now it might not even matter, because the machines can do the studying for us.

What will be important, then? Formulating problems, and then tweaking resultant autogenerated code. So code fluency will still be needed. Just not for the boilerplate; for that, we’ll have tools like ChatGPT and AlphaCode.

Tools Of The Trade

Tools Of The Trade

I’ve been working primarily from home since early 2019, and over time have carefully crafted a space that suits my needs pretty well. Here’s what I’ve put together, roughly from left to right as pictured:

Tuft and Needle California King mattress: Sleep is critical to success at work (and life in general). Upgrading to a big bed was a game changer, I can’t believe it took 21 years of marriage to take that plunge. Worth every penny.

Washburn 12 string acoustic guitar: My wife bought this for me for our first Christmas together in 1998. I’m not much of an acoustic player, but I can strum a few chords now and then.

Carvin Bunny Brunel signature 5 string bass: I’ve been playing bass for about 8 years, first on a Gretsch Junior Jet small scale, and then on this considerable upgrade.

Gallien-Krueger MB 112 combo amp: For a couple years I played through a hand-made German tube amp paired with a classic Ampeg 8×10 refrigerator-sized speaker cabinet that I refurbished myself. It was loud as heck and cool to look at, but weighed over 200 pounds and barely fit in my largest car. The tube amp was also finicky and I once shocked myself on its 220V power input (not fun). I’ve never regretted selling it and picking up this lightweight combo and its companion extension cab (not pictured). Just as powerful, better sounding, 20% the weight and volume, and more reliable. A no-brainer.

Casio Privia PX-130 digital piano: In 2010 I was on a short-term assignment 2500 miles from home, and needed something productive to do during my downtime. Bought this instrument and had it shipped to my extended stay hotel; it was just what the doctor ordered. The assignment ended up becoming a full-time gig, the one that led me to relocate from Ohio to San Diego. One of my better life decisions.

Picasso’s The Old Guitarist (not pictured): The art in the photo is some generic thing we bought when relocated, I don’t even remember where from. So I’d rather talk about the artwork you can’t see here, but will see in the background if you’re on a video call with me. It’s a print of my wife’s favorite painting. Also in the room are a pencil drawing of a character from the Wingfeather Saga that I commissioned the author’s son to make, and handwritten lyrics from one of my favorite Andy Gullahorn songs.

Jarvis Standing Desk from Fully: I’ll never willingly go back to a regular desk after enjoying the benefits of an adjustable height desk. I stand about 80% of the time now. And this desk was the perfect size, don’t really need a lot of space beyond what’s needed for my computer workstation.

Varier Variable Balens kneeling chair: Definitely overpriced given I stand most of the time, but given how unhealthy sitting is, when I’m not standing, I quite like kneeling. It also functions well on carpet, and tucks away nicely, both of which matter in a bedroom-based workspace.

Macbook Pro 16″ 2019: Haven’t used a Windows PC since 2012, and won’t ever go back. Would prefer native Linux, but I can still do enough terminal-based things to make it feel Unix-like. Upgrading to 32GB of RAM and going back to physical function keys would be nice but I’m fine for now.

Dell UltraSharp 34 Curved USB-C Monitor: Absolutely love only needing to plug in a single cable into my laptop for data and power, and the integrated USB ports mean no additional docking station is needing. Five years ago I would have wished for more resolution (and likely a second monitor), but training myself to organize my active work across multiple desktops obviated that need, and the screen itself is plenty wide for two windows side-by-side. As an aside, anyone who still insists on 80 character limits for code line length needs to be sent back to 1998; silliest linter default setting ever.

Logitech MX Mechanical Mini keyboard: The loud clickity-clack would get annoying in an office, but I’m by myself all day, so I’m loving it. The layout isn’t quite the same as the keyboard on the laptop itself, which is a tiny bit annoying, but I’ve adjusted.

Logitech MX Master 3S mouse: Lots of buttons and scroll doohickeys, fully programmable, feels great in the hand. Especially love that I can activate mission control with one press; really helps keep my windows organized.

Razer Kiyo Pro webcam: I spend a good portion of my day on video calls, including ones with customers with whom I need to earn trust. Every bit of quality matters when trying to communicate, thus a high-quality webcam that works in a variety of lighting conditions (I’m often on calls early in the morning before the sun is up). Sadly their software doesn’t work on Mac, but I can still tweak the settings with CameraController.

Blue Yeti X microphone: Audio quality probably matters even more than video quality when it comes to projecting trustworthiness and authority, thus I didn’t scrimp. With the boom arm I’m able to position the mic so it’s just out of the frame of the webcam. I’m not going for streamer or podcast vibes, I want the focus on my message, not the gear.

Shokz OpenRun Pro mini headphones (not pictured): Having a mic like the Yeti X means I can’t play call audio through speakers or listeners will hear feedback. That means using headphones. But I don’t want something bulky or that draws attention to itself. These are barely visible, sound sufficiently good for voice, have a battery that lasts darn near forever, and the open design means I can go between taking calls and hearing what’s going on around me at will. As the name implies, they’re also great for exercise. For music, and when I need isolation, my Sony WH1000XM4 headphones are vastly better, but they’re not nearly as convenient for every day wear.

Timbuk2 San Francisco backpack: I’m due for an upgrade here, but for now this gets the job done. What’s more important is what I keep in it at all times:

  • One each of a black, blue, and red pen, a 0.5mm mechanical pencil, and a small tablet of paper
  • Dual-ended whiteboard markers (blue, red, black, and orange)
  • USB-C to video adapter (includes HDMI, DVI, and VGA because you never know)
  • Nekteck 107W USB-C Charger with a 10 ft power cord (love this thing and its 4 ports)
  • Anker portable battery, and various USB power cables, enough to adapt between C, A, and micro-B as needed
  • USB-A to Apple lightning cord (I don’t have an iPhone, but I want to be helpful if others need one)
  • Extra charging cable for my watch and my headset (both of which are proprietary)
  • Toothbrush, toothpaste, floss, breath mints, deodorant, moist hand wipes, napkins, and a couple masks
  • Advil, Aleve, cold medicine of some kind, sunscreen, chapstick, and earplugs
  • Small stack of business cards
  • Travel umbrella

Thanks for reading all the way to the end of this monster post. Happy New Year to ya!

End Of An Era

End Of An Era

Frederick Brooks died last week. He was a giant of the software industry, and deserves wider recognition for his contributions. Start by reading the New York Times article linked above, then grab a copy of The Mythical Man-Month. Few works have moved me so profoundly, at least if you measure by number of times I reference them (which, incidentally, is roughly how Google’s PageRank works).

Rest in peace, Mr Brooks. I’m thankful for you, and I’m sure you won’t be forgotten by those who build our castles in the air.

Adventures With APIs

Adventures With APIs

I’ve written before about the advantages of knowing how to dig around in DevTools to reverse engineer website interfaces. This week I’ve had three further instances of doing this work to good effect.

The Friendly Skies

Firstly, I travel a lot, enough that I now have Executive Platinum status on American Airlines. This means I’m first in line for complimentary upgrades, but only if there are seats available. So I wanted an easy way to go straight to a complete seat map to look at availability without needing to go through a full search on the website. Turns out there’s a magic URL that does just that, and all you need to do is pass it some parameters. So I present to you, a quick and dirty seat map lookup form. Give it a try!

While that’s cool, I wondered if I could make it simpler by leveraging a flight data API like the one from FlightLabs. That was pretty straightforward as well. Though I couldn’t embed it in WordPress, I did script it up in Python for your enjoyment. Just pass it a flight number, and it’ll do the rest. Neat!

Shake It Off

This week Taylor Swift tour tickets went on sale, and needless to say it broke Ticketmaster, despite their best attempts to add friction via pre-registration to enter a lottery to win a code to join a queue to enter a room to maybe get lucky enough to click fast enough to buy tickets. Sadly I was unsuccessful at securing seats despite dozens attempts across several days. But I did learn something about the API Ticketmaster used to check queue status, so all was not lost.

When I first joined the queue, the following was displayed:

Of course I was curious: how many more than 2000 people were there… 5000? 25000? A million? So I opened up DevTools, and took a look at the calls coming back from the server to check status. Lo and behold, there was a wealth of info in an easily digested JSON block:

Wouldn’t it have been helpful to display that information to the user? At least the exact users in line, and the expected service time value. No idea why it wasn’t shown, other than Ticketmaster not being known as a terribly customer obsessed company.

Automating ******** Across ****

The final example can’t speak of publicly other to say my penchant for automation will save my employer a sizable amount of money. In these uncertain economic times, that’s always a good thing.

Meta Post

Meta Post

Really enjoyed Two Heads Are Better Than One, a discussion of the various ways technology has allowed humans to have “second brains.” I realized in some ways this blog is one such implementation; it’s a place I can capture thoughts and stories so that I can recall them later without keeping them in working memory.

As a bonus, via the article I discovered Obsidian, which I’m now dying to try out. I’m a sucker for Markdown and the power of plain text processing tools.

Reap The Whirlwind

Reap The Whirlwind

This summer my family and I went on a two week European vacation. Six cities in fourteen days is no joke, but we had a blast, saw a ton, and stayed healthy throughout. For something different, I thought I’d catalog our activities here.

Day 1 – Rome

  • Land at Leonardi da Vinci International Airport
  • Taxi ride to the hotel (aggressive driver kept us on our toes)
  • Jetlag recovery nap (essential)
  • Pizza at Taverna Rossini
  • Pico Gelato for dessert (tears of joy were shed)

Day 2 – Rome

  • Trevi Fountain
  • Colosseum
  • Piazza del Campidoglio
  • Pantheon
  • Lunch at La Soffitta Renovatio
  • The Vatican, including the Sistine Chapel and St Peter’s Basilica
  • More gelato at Pico
  • Quick dinner at the hotel before crashing in bed

Day 3 – Rome

  • Temple of Asclepius
  • Walk through Villa Borghese
  • Piazza di Spagna (the Spanish Steps)
  • Trevi Fountain (again)
  • Vicus Caprarius (ruins under Trevi)
  • Life-changing carbonara at Al Simeto (no one spoke English, a good sign)
  • Even more gelato at Pico

Day 4 – Florence

  • Morning train to Florence, and walk to our Airbnb that was right on the square
  • Accademia Gallery to see Michelangelo’s David (breathtaking)
  • Uffizi Gallery (Birth of Venus, amongst other masterpieces)
  • Life-changing chianti at La Buchetta, and the steak was pretty good too
  • Evening walk at the Piazza della Signoria

Day 5 – Florence

  • Climb to the top of the Brunelleschi Dome
  • Tour of the Duomo cathedral
  • Cappelle Medicee
  • Basilica di San Lorenzo
  • Trattoria Sergio Gozzi for lunch with an old friend (and killer truffles)
  • Battistero di San Giovanni
  • Palazzo Strozzi
  • Ponte Vecchio
  • Gelateria Edoardo il gelato biologico (obviously)
  • Quick pizza from a grab and go

Day 6 – Alps

  • Walk to the Florence train station
  • Train through Bologna, Bolzano, Innsbruck
  • Arrived in Munich in the afternoon
  • Dinner at Haxnbauer im Scholastikahaus (pork knuckles FTW!)

Day 7 – Munich

  • Bus ride to Bavaria
  • Neuschwanstein Castle
  • Quick lunch (sausages and beer)
  • Oberammergau
  • Linderhof Castle

Day 8 – Munich

  • Morning run in the Englischer Garten
  • Tour of Dachau (a sobering and essential experience)
  • Shopping in Marienplatz
  • Walkthrough of Peterskirche (including a climb of the tower)
  • Stroll through the Englischer Garten in the rain
  • Dinner at Hofbräuhaus
  • Midnight sleeper train to Paris

Day 9 – Paris

  • Taxi to the hotel to freshen up
  • Walk through Jardin des Plantes
  • Brunch at Clint (poached eggs, yummy)
  • Recovery nap (absolutely essential)
  • Shopping in Le Marais
  • Dinner at Robert et Louise (beef cooked over an open fire plus a Bordeaux)
  • Walk through Place des Vosges and Place de la Bastille
  • Cards in the hotel lobby

Day 10 – Paris

  • Stroll through Montmartre
  • The Basilica of the Sacred Heart of Paris
  • Eglise Saint-Pierre de Montmartre
  • Cheese sampling from a local shop
  • Walk past Moulin Rouge
  • Arc de Triomphe (only a couple quick photos)
  • Eiffel Tower (didn’t go up though)
  • Pont Alexandre III Bridge
  • Eglise de Saint Germain des Pres
  • Macarons from Boutique Pierre Hermé
  • Le Jardin du Luxembourg
  • Panthéon (photo from afar)
  • Cathédrale Notre-Dame (just an outside view)
  • Ile de la Cité
  • Sainte-Chapelle (beautiful stained glass)
  • Lunch at Brasserie Les Deux Palais
  • Quick walk past Musée du Louvre
  • Tried to tour the Catacombs, but alas they were booked out
  • Crepes from Au Beurre Salé
  • Well-earned sleep

Day 11 – London

  • Eurostar through the Chunnel (delightful train and fast!)
  • Tube to Pimlico station
  • Bit of recuperation at the Westminster Hotel
  • Tour of the Churchill War Rooms
  • Dinner at The Admiralty (Trafalgar Square)
  • Walk past Westminster Abbey, Big Ben, and Parliament

Day 12 – London

  • Several hours of exploration at the National History Museum (Dippy!)
  • Nap on the lawn at Hyde Park
  • Princess Diana Memorial Fountain
  • Science Afternoon Tea at The Drawing Rooms
  • Stroll over Westminster Bridge

Day 13 – Oxford

  • Morning train to Oxford
  • Fish and chips at Wig & Pen
  • Photos at The Eagle and Child (sadly closed due to COVID)
  • Shopping on Cornmarket Street
  • The Sheldonian Theatre
  • The Hertford Bridge (most photographed spot in Oxford)
  • Bodleian Library
  • Blackwell’s Bookshop (bought a rare Isaac Asimov book: The Clock We Live On)
  • Radcliffe Camera
  • University Church of St Mary the Virgin
  • The Bear Inn (serving Oxford since 1242)
  • Christ Church College
  • Merton College
  • Martyrs’ Cross

Day 14 – Journeying

  • Sleep in late
  • Depart Heathrow in the early afternoon
  • And land in San Diego in the late afternoon (hooray for timezones)

And there you have it. Not a bad way to spend a fortnight.

Into The Sunset

Into The Sunset

I’ve mentioned before my penchant for minimalism, which is why for the past 8 years my code editor of choice has been Atom (in fact, I may have been a beta tester for it, my memory’s a bit fuzzy on that point). Which is why it bummed me out a bit to read it’s being shut down at the end of this year. Technology marches on, I suppose. I can’t blame GitHub Microsoft for wanting to consolidate development effort in their fully-featured IDEs, especially integrated cloud-based solutions like Codespaces.

Still, I’m going to miss Atom’s simplicity and customizability (I’d even contributed to a few plugins). It was robust enough to be a complete development environment (for my coding style, at least), yet snappy enough for quick one-off text file editor. For the former case I’ll probably get back into VSCode, and Sublime Text ought to do the trick latter. Though maybe I can use it for both?

Left Hand, Meet Right Hand

Left Hand, Meet Right Hand

Earlier this week I got an email from a recruiter. In itself, that’s not a remarkable occurrence, I’ve gotten 263 such emails since I started tracking them back in 2015. What made this one funny is that it was from my current employer.

I’m regularly asked about the corporate culture at AWS, and a common way I’ve described it is being like a large collection of small startups. This decentralization has a number of benefits, not least of which it only rarely feels like I’m working for a curmudgeonly big business (especially when compared to my last large company gig). But every once in a while the disadvantages show.