2025-09-25 10:37 - Making
This is my old couch. I got it when I moved into Manhattan and it's followed me here to Maryland. I've already decided it's not going to move with me again. It was cheap when it was new, and it hasn't aged well. I really like the wide arm rests: good for arms, and leaning against, and resting objects on. But since the outside seats are recliners, they don't have a lot to attach to and have sagged after years of that usage. More obviously: the pleather surface of the footrests have worn away. I've wanted to improve this for a while but never got around to it.
Yesterday I finally got off my butt. At a local thrift store, I found a brown sheet for only a few bucks. This morning, I started work in earnest. For some reason I started by imagining a sewn cover, and wasted a lot of effort measuring and trying to lay out something that I could sew. I was hoping to leverage the built in elastic (this being a fitted sheet) to make it naturally "stick" to the footrest. Before too long I realized I'm doing upholstery so I simply got out the staple gun, and things went much quicker.
Each footrest got a piece of batting cut just smaller than it (can't add any thickness around the edges, or it won't fold back into the couch correctly) plus a piece of the sheet. This was stapled around the edges, then reattached. Look closely and you can see where I colored in (with black marker) the bright fabric backing, where the pleather part had worn off, a few years ago. And the much wider section of what has worn off now.
Here it is in place. The color certainly isn't a perfect match, but on the other hand it looks way better than the flaking broken surface underneath! The batting helps smooth out that roughness. A simple and cheap repair, but it will probably last as long as I need it to.
2025-09-10 12:40 - General
When I bought my (used) car in late 2022, it had two minor problems: a couple small chips in the windshield, and the wiper blades hit each other. It's got opposed wipers, which sweep both from the center out (as opposed to the more typical parallel arrangement). The passenger side wiper is a bit lower, and would rise too quickly, striking the other blade during operation. But just barely. I didn't know why, and for a quick "fix" originally, I trimmed down the length of the wiper. It's got "beam" style blades, which made this practical. I kept making small adjustments, and I could see it getting better. But by the time it was no longer hitting anymore, I had removed four or five inches from that side.
The windshield chips were just cosmetic, and out of the way enough to not be a big deal. But at some point with a significant (ten or fifteen percent) discount via a credit card, I opted for repairs. I was warned that there's a chance for them to cause further damage, but I figured: it's just two tiny cosmetic chips, they don't even go all the way through the glass. It'll be fine. It wasn't. Ironically, the smaller of the two did fixes did end up causing a crack in the windshield. Just cosmetic, and the further out of the way one. And for about a year it was small, still minor. Then one day, overnight, the crack jumped all the way from the out of the way origin on the passenger side, right across the primary line of sight the whole way to the drivers' side. So I got the windshield replaced. I had avoided that originally because: The car has rain detectors to automatically control the wiper, and replacement glass might be worse, and because I fear how well the rear view mirror would be attached. But that all worked out alright in the end. (And I wish I went for replacement to begin with: not only would it have saved hassle, but it wasn't as expensive as I expected!) The installer complained that they had trouble aligning the wiper blades! (I think they could have just been folded out of the way on the hinges built into the arms, but apparently they were taken off!) And also commented that the nut holding one of the wiper arms on was incorrect. (Foreshadowing!)
Fast forward a while. I've still got the wiper weirdness, and I've also observed that the washer fluid filler neck is very loose: I think it makes space that the fluid easily evaporates out of, over time. I get far less usage out of it than I expect, between refills. The local junk yard alerted me that they got a C-Max in, so I went and I got two wiper arms to experiment with, and a washer fluid reservoir. I expected to bend one of the wiper arms, tilting the blade so it's less likely to interfere.
Well I got home with the extra blades and realized I didn't take note of which was which: left/right or driver/passenger side. The process of figuring it out made me realize: On my car, they're installed backwards! They've got bends and angles from the factory, and one is longer than the other. So I've now reversed them, and they operate perfectly, and with plenty of space between them during operation! (The spare junkyard arms had blades installed, no worse than what I've got now, so I took a full-length one from there, and still no interference!) Would have been an easy fix if I knew about it! Plus I think it will be a minor aerodynamic improvement: the old layout had one wiper sticking up higher than it should have, into the air stream.
As far as the washer fluid goes: the extra junkyard replacement is just as loose as mine. It sure seems like there's supposed to be a rubber gasket between the tank and the fill neck, which are separate pieces. I think I'll try to figure out a good way to make such a gasket. On the replacement parts, easy to work on outside of the car.
2025-06-20 15:50 - Gaming
This was originally (at the date stamp above) a post that started when I used my PS3 for the first time in a while, and realized that its trophies were a record of my otherwise lost gaming history. Then I took some more effort to find equivalent data sets and gathered them together. Now I'm hoping to keep this up to date as a living document.
| 2008 |
December | PS3 | Grand Theft Auto IV |
| 2009 |
February | PS3 | LittleBigPlanet |
| | March | PS3 | Mirror's Edge |
| | May | PS3 | Prince of Persia |
| | May | PS3 | The Elder Scrolls IV: Oblivion |
| | July | PS3 | Fallout 3 |
| | November | DS | Scribblenauts |
| | November | DS | Chrono Trigger |
| | November | DS | Professor Layton and The Diabolical Box |
| | December | PS3 | Valkyria Chronicles |
| 2010 |
March | PS3 | God of War |
| | May | PS3 | God of War II |
| | August | PS3 | Rock Band 2 |
| 2011 |
April | PS3 | Gran Turismo 5 |
| 2012 |
April | PS3 | Lego Rock Band |
| | May | PS3 | Red Dead Redemption |
| | June | PS3 | inFamous |
| | July | PS3 | Skyrim |
| 2013 |
June | PS3 | Fallout: New Vegas |
| | June | PS3 | Catherine |
| | September | PS3 | Grand Theft Auto V |
| | November | PS3 | Final Fantasy XIII |
| | December | PS3 | Gran Turismo 6 |
| 2014 |
February | PS3 | Heavy Rain |
| | March | PS3 | Dragon Age: Origins |
| | March | PS3 | Tom Clancy's Splinter Cell HD |
| | April | PS3 | Metal Gear Solid V: Ground Zeroes |
| | April | PS3 | Uncharted: Drake's Fortune |
| | April | PS3 | Tom Clancy's Splinter Cell Pandora Tomorrow HD |
| | May | PS3 | Uncharted 2: Among Thieves |
| | May | PS3 | Tom Clancy's Splinter Cell Chaos Theory HD |
| | June | PS3 | Uncharted 3: Drake's Deception |
| | July | PS3 | Deus Ex: Human Revolution |
| 2015 |
April | PS3 | The Last of Us |
| | December | PS4 | Metal Gear Solid V: The Phantom Pain (100%) |
| 2016 |
February | PS4 | Fallout 4 (100%) |
| | April | PS3 | Metal Gear Solid Peace Walker HD |
| | August | SNES | Super Mario RPG |
| 2017 |
February | PS4 | Life Is Strange |
| | March | PS4 | Mirror's Edge: Catalyst |
| | September | Wii U | New Super Mario Bros. U |
| | September | PS3 | Persona 5 |
| | October | PS4 | The Last Guardian |
| | December | 3DS | Samus Returns |
| 2018 |
May | Switch | Super Mario Odyssey |
| | June | PS3 | L.A. Noire |
| | November | Switch | The Legend of Zelda: Breath of the Wild |
| 2019 |
January | Switch | Inside |
| | July | PS1 | Chrono Cross |
| | July | PS3 | Bioshock Infinite |
| | July | PS3 | Assassin's Creed: Brotherhood |
| | November | Switch | Hollow Knight |
| | November | Switch | Puyo Puyo Tetris |
| | November | Switch | Stardew Valley |
| | November | Switch | SteamWorld Dig |
| | November | Switch | SteamWorld Dig 2 |
| | November | Switch | Super Smash Bros. Ultimate |
| | November | Switch | SteamWorld Heist |
| | December | Switch | Untitled Goose Game |
| | December | Switch | Gorogoa |
| | December | Switch | Death Squared |
| 2020 |
January | Switch | Snake Pass |
| | May | Switch | Dead Cells |
| | June | Switch | What the Golf? |
| | June | Switch | Picross S |
| | August | Switch | The Turing Test |
| | August | Switch | Picross S2 |
| | August | Switch | Mr. Driller DrillLand |
| | August | Switch | Invisible Inc. |
| | September | Switch | Civilization VI |
| | September | Switch | A Short Hike |
| | September | Switch | The Great Perhaps |
| | September | Switch | Borderlands: GOTY |
| 2021 |
May | Switch | Bowser's Fury |
| | June | Switch | Blue Fire |
| | June | Switch | Mew Super Mario Bros. U Deluxe |
| | July | Switch | Picross S3 |
| | September | Switch | Human: Fall Flat |
| | September | Switch | Baba Is You |
| | September | GBA | Mario vs. Donkey Kong |
| | October | Switch | Picross S4 |
| | December | Switch | Mini Metro |
| | December | Switch | Boxboy! + Boxgirl! |
| 2022 |
July | PS5 | Astro's Playroom |
| | July | PS5 | Gran Turismo 7 |
| 2023 |
May | Switch | The Legend of Zelda: Tears of the Kingdom |
| | July | PC | Portal |
| | July | PC | Portal 2 |
| | July | PC | Portal Stories: Mel |
| | July | PC | Portal Reloaded |
| | July | PC | Kerbal Space Program |
| | October | Switch | Good Job! |
| | October | Switch | Picross S5 |
| | October | Switch | Super Mario Bros. Wonder |
| | October | PC | The Talos Principle |
| | December | PS3 | inFamous 2 |
| 2024 |
February | PC | Cities: Skylines |
| | February | Switch | Pikuniku |
| | February | Switch | Phoenx Wright: Ace Attorney Trilogy |
| | March | PC | Factorio |
| | March | Switch | Blossom Tales |
| | April | Switch | Oceanhorn |
| | May | Switch | Bastion |
| | May | PC | Alba: A Wildlife Adventure |
| | May | PC | Her Story |
| | May | PS3 | [Prototype] |
| | May | PC | Slay the Spire |
| | July | PS3 | Ratchet & Clank |
| | July | PS3 | Beoynd: Two Souls |
| | October | Switch | Subnautica Below Zero |
| | October | Switch | Layton's Mystery Journey: Katrielle and the Millionaire's Conspiracy - Deluxe Edition |
| | October | PC | Superhot |
| | November | Switch | Picross S6 |
| | December | PC | Balatro |
| 2025 |
February | PS4 | Red Dead Redemption II |
| | March | PC | Antimatter Dimensions |
| | April | Switch | Yoshi's Crafted World |
| | May | PC | BitBurner |
| | June | PC | Tandem: A Tale of Shadows |
| | June | PS3 | Flow, Flower, Journey |
| | July | PS4 | Fallout 4 (replay w/ all DLC) |
| | August | PC | Braid |
| | August | PC | Firewatch |
| | August | PS5 | Horizon: Forbidden West |
| | September | PC | Half-Life |
| | September | PC | Half-Life 2 |
| | September | PC | Half-Life 2: Episode One |
| | September | PC | Two Point Hospital |
| | October | PC | Turnip Boy Commits Tax Evasion |
| | October | Switch | Timespinner |
| | October | PC | Escape Academy |
| | November | PC | Train Valley 2 |
2025-06-11 19:55 - General
Low quality image, because it's a skittish wild animal and I could only get the shot well zoomed in. But: I saw what must be an albino squirrel on my walk this morning. Those can't be too common.
2025-05-21 07:28 - General
For a while now, but somewhat rarely, I've noticed a strange jittery sort of sawtooth pattern to the graph of the temperature in my kitchen. (I've got sensors scattered around the house, to enhance decisions around comfort and energy expenditure.)
More recently, I added an energy sensor to the refrigerator. (I was doing some specific appliance energy measurements, as part of research into a solar power project.) Given a relatively stable outdoor temperature, so little baseline change, the kitchen temperature jaggies showed up. And I just realized: I'm measuring the waste heat of the refrigerator! It kicks on roughly once an hour, and the temperature jaggies turn upwards with the same cadence. (With a little delay, because the sensor is in the opposite corner of the room as the fridge.)
2025-04-24 21:13 - Making
When I moved here, I knew I'd be without a dishwasher — which I had grown accustomed to. It's not really a big deal, but it is an inconvenience. I survived that way just fine for a couple years. I knew about "countertop" dishwashers. But they seemed to all require either a very awkward and probably destructive plumbing-in process, or used awkward sink faucet attachments (which would get in the way, needing to be hooked and unhooked each time). Possibly more hassle than the chore they'd be replacing. But then I learned about the existence of no-plumbing models: A drain hose simply runs towards the sink (or a bucket!), and water supply is simply poured in top, e.g. from a pitcher. I managed to find a cheap used one (~$300 new, $100 for the one I got) and have been enjoying it since.
But it does take four-ish round trips, waiting for the pitcher to fill, then carefully pouring it in without spilling. I've enjoyed the dishwasher enough that I put some thought into plumbing in the supply line. My used appliance didn't come with the original supply line, so it took some creativity. But I got a bit lucky!
The supply for the sink is a ⅜" plastic line. After some measuring and research, I was confident I knew the thread (¾" BSP) for the inlet on the appliance. And I found an adapter from that to ⅜" push-in fitting.
So with that adapter, and a hose and fitting kit I put this together: The existing incoming water supply now goes to a tee, which feeds the sink and also (via a shut off valve) the dishwasher. From there, it only takes two inconspicuous holes through the very back of the cabinet towards the fridge.
And there it is! Hooked it up with a 90° fitting to ensure there's no stress on the line, and set it back in place. If you look close, you can see the drain hose passing behind and then to the left of the faucet. When the dishwasher turns on, it opens a valve to fill its internal tank (which takes surprisingly long, perhaps it wants a bigger supply line) and from there it's all automatic. Worked first time, no leaks.
I've been thoroughly enjoying Balatro lately. I've proceeded through the challenge mode, and completed 19 of the 20 challenges. The last one, though, seems very difficult. Enough that I went looking online for suggestions of how to beat it. I found a post claiming that the four of a kind hand is the winning strategy. I immediately scoffed. Drawing a four of a kind is just too hard! Right? Right??
I felt the need to validate my intuition, that it's too hard to draw a four of a kind. I tried to look up the chances online, but I have a problem. I want the chances for this game. It's a little like poker, but barely. Specifically: you draw a hand of eight cards. Then you get some number (three, normally) of discards, of up to five cards. Then you get some number of hands to play (four usually, so three can be "throw away" fake discards). Or: what I really want to know is how likely it is to: A) draw eight cards, then B) as necessary discard up to five of them, up to six times, and end up with a four of a kind in hand. Nothing I could search up quickly gave me the answer, but the "real answer" was to simply simulate it. I got nerd sniped, and as a result I did. Simulate it.
import collections
import random
DECK = list('23456789JQKA' * 4)
N = 10000
def draw_from(deck):
i = random.randint(0, len(deck) - 1)
return deck.pop(i)
results = []
for _ in range(N):
deck = list(DECK)
random.shuffle(deck)
hand = []
for _ in range(8):
hand.append(draw_from(deck))
for i in range(7):
cnt = collections.Counter(hand)
com = cnt.most_common()
if com[0][1] >= 4:
results.append(i)
break
elif i == 6:
results.append(None)
break
else:
for _ in range(5):
d = com[-1][0]
cnt[d] -= 1
com = [x for x in cnt.most_common() if x[1] > 0]
hand.remove(d)
for _ in range(5):
hand.append(draw_from(deck))
for result, freq in collections.Counter(results).most_common():
if result is None:
print('Failed %.2f%%' % (freq / N * 100))
else:
print('Success with %d discards %.2f%%' % (result, (freq / N * 100)))
This is some quick and dirty code. I wrote it in almost exactly half an hour. (As of reading this post, I realize I shuffled the deck, so I didn't need the extra step of randomly choosing a card to draw. I could have "drawn from the top". Probably other minor mistakes of that nature. But I think it's a valid simulation.) And it tells me:
$ python four_of_a_kind.py
Failed 42.50%
Success with 6 discards 15.02%
Success with 5 discards 13.09%
Success with 4 discards 11.59%
Success with 3 discards 8.99%
Success with 2 discards 5.69%
Success with 1 discards 2.72%
Success with 0 discards 0.40%
Indeed: using "all six" discards results in only a slightly-under-60% chance of finding a four of a kind. In a standard 52 card deck. (Changing slightly each run, as this is a random simulation, not exact probability.) So this might be a workable strategy, but it requires some luck in manipulating your deck, to be able to make the four of a kind hand regularly.
2024-12-24 18:31 - Making
I find something cozy and pleasant about having a candle burning, during the winter. I've managed to find old partially used bits of various candles from a few places. So for a while I've been remelting these into the containers for other candles. Over time I've figured it out and can generally produce a candle that burns nicely and consistently. Or at least I can fix it part way. (When necessary, which is getting more rare.) The hardest part is getting the wick nicely centered. My most preferred method now is to stick a metal rod down the middle, with some paper card at the top to keep that end centered. When I remove it, the wick has the perfect spot to go to. Since the wax shrinks as it cools I usually want to add a top-up anyway, and this fills the remainder of the hole.
I also prepared some christmas cookies. These are "M&M Magic Bars". They didn't come out as pretty as the pictures, but they sure look scrumptions!
I took up home brewing this summer. I started with a very basic kit, then I tried making a hard cider (both turned out well), I made a mead (just bottled, haven't tried it yet besides tiny sips, seems good but strong), and then most recently I did an "all grain" brew. Above is the gathered ingredients and equipment, then the "mash in" step, where the grains are steeped in hot water to convert the starches to sugars. After these are carefully removed the "wort" as it's now called is boiled. Finally, it all goes in a vessel with some yeast to ferment. Since it was my first time with the full process, I had some learning opportunities, but I'm cautiously optimistic that it will turn out well. The yeast are definitely doing their work.
2024-12-13 11:04 - Linux
I've known about gentoolkit for a while. For that time equery has been my standard way to inspect portage. Turns out there's (a whole collection of useful portage tools, including) also the "q applets". These Q applets are typically faster, and one of them will report the installed size of packages.
$ qsize -m | sort -t , -k 3 -n | column -t -s ,
...
sys-devel/gcc: 1746 files (1742 unique) 100 non-files 282 MiB
dev-lang/rust-bin: 131 files (125 unique) 31 non-files 474 MiB
sys-kernel/linux-firmware: 4204 files 379 non-files 1218 MiB
sys-kernel/gentoo-sources: 81770 files 5322 non-files 1291 MiB
I've got reason to inspect installed package size and I just found this. And it executes in only a few seconds on my machine with nearly 800 packages installed.