1,806 karma · joined September 13, 2020
https://hardwarehacks.org
I recently bought a $20 flash drive to store the entire contents of a my friend's late-2000s PC with a 250GB hard drive on. Didn't think much of it.
(Yes, I know the article is from 1994.)
We had Merlins at my parents' store when I was growing up, and an interesting artifact of the analog channel was that some analog data was possible. For instance, we hung a fax off one of the Merlins (14.4k was fine); I likewise got get 33.6k off it when I plugged in my modem, but could never get 56k. In hindsight, that's because 56k actually requires the line to support digital signalling, which the Merlin did not.
That said, I'm not sure what to attribute that to. It could be the broad availability of drug rehab and housing services. It could be that the climate is inhospitable to living on the street for the majority of the year. For all I know, it could be an aftershock of the city's love affair with redlining, effectively putting me away from where I would see it.
While it's possible to distribute state to many AWS regions and select the closest one, I ended up going a different route: packaging state alongside the application. Most of the application's state was read-only, so I ended up packaging the application state up as JSON alongside the deployment bundle. At startup, it'd then statically read the JSON into memory - this performance penalty only happens at startup, and as long as the Lambda functions are being called often (in our case they are), requests are as fast as a memory read.
When the state does need to get updated, I just redeploy the application with the new state.
That strategy obviously won't work if you need "fast" turnaround on your state being in sync at all points of presence, or if users can update that state as part of your application's workflow.
One of the engineers under me often expresses his discontent that I won't give him answers, either. I think he's more than able to get to those answers on his own, and that the value he'll derive from learning how to learn is vastly greater than the value of being able to complete his work faster. On the other hand, he's given me the feedback that the method is excessively socratic at best, and flat-out frustrating at worst.
I also worked for a company where energy drinks and coffee became part of my diet, then left of my own volition. Then I left, and they're still doing just fine in spite of none of my team hitting caffeine anywhere near as heavily, so I assume the feeling that I'd get fired or somehow disciplined is/was all in my head.
Contrast to today, where user interfaces have largely lost the discoverability principle, and help is often asking someone else who's ridden the wave to where we are today.
On the outbound side, many accepters of mail will deny mail from SMTP servers on a residential IP address, as provided by the Spamhaus Policy Block List (https://www.spamhaus.org/pbl/) or equivalent. Unfortunately, there's not much one can do to get off this list - ISPs self-publish their own residential IP space onto it. In order to self-host from home, business-class service or higher is in order. Or, again, use the public cloud, and hope your compute instance's IP isn't on some other block list.
On the inbound side, though, many ISPs block inbound port 25. Since that's the agreed-upon port for mail receipt, there's no real way around this. Several times while I self-hosted off residential, I was able to call Comcast support and ask for the ban to be lifted, but not before fighting through several layers of level one support asking me to configure my mail client differently. The real kicker, though, is any time my modem was rebooted (I owned my modem, too!), I had to call in and request it _again_. My (very small local) ISP in upstate New York also performed this blocking, but _would not_, in the face of any complaining, lift the block.
Still (as said before) not more useful to me than as a weekend project. I used it a few times with my CB radios to see how far I could transmit 1200 and 300 baud.
Yes, distributed tracing tools do a much better job of this, but it's not always a given that a service will be instrumented. The generic tools (almost) always work.
I have a switch (I think a TP-Link TL-SG1016PE) with PoE - and a finnicky PoE device that periodically needs a reboot, so I figured I'd replay turning the port on and off in the Web interface. Notably, logging in does not issue me any authentication token, but I can still turn the port on and off - and can still do it via `curl`, too. But as soon as I try it on another machine? Access denied!
(Yes, I could just fake the login process the same way, but that was more work than I had time for.)
Take for instance VLIW architectures (Itanium used 64-bit registers but 128-bit instructions; you packed two ops into an instruction), vector extensions (AVX-512 uses 512-bit registers to hold multiple integers from 16 to 64 bits long) - we've long known these to be viable strategies for long word lengths in a CPU. But the ability to operate on a 128-bit integer directly doesn't seem to have a use case yet.
I _would_ call moving from a TI-83 to the TI nSpire CAS an upgrade - there's a whole host of things that the nSpire can do which the TI-83 can't, like symbolic calculations and matrix math with complex values. I'd also bet it can emulate a TI-84 faster than a native TI-84.
I figured I'd learn something by putting in the "I'd love to know others" bit, but this is something I didn't know I could do, and is genuinely useful to know!
Take bash, for instance - each time you run a command (this list is nonexhaustive; I'd love to know others):
1. If you have a `PROMPT_COMMAND`, it'll be run.
2. The command will be echoed to your history file.
3. If you hit <TAB>, arbitrary functions might run (for completion).
I don't know what zsh may do on top of this, but my guess is that it's significantly more than bash. That's not a demerit to zsh - that's exactly what it should do - but visibility would be nice.
> Well, what kinds of people work for 1% of a post-A startup? Average people (and below).
The people hired in the A round have no doubt been selected, _and_ self-selected a startup, for their ability to work at the mentioned 20x force multiplier. A 100-person company (let's call that late series B) is running, using the article's own numbers, at a 2-4x force multiplier, and a C-or-later startup with 200 or more people is running at perhaps even a 1.5x force multiplier.
Yes, there will be individuals who bring the force multiplier up, and individuals who bring the force multiplier down, but ultimately, the people in the organization are _above_ average if the organization's force multiplier is greater than one.
Also considering that founding engineers are sometimes some of the first to leave (especially as non-startup culture becomes entrenched), we can't as easily argue that the original 20x engineers are carrying the (0<n<1)x engineers.
1. K3s may not be too heavy, but basically anything that runs on it is. For all but the most basic jobs, I was still looking at one, or maybe two, apps per SBC. Couple with 10/100 networking on many of these, and there's a lot of extra time/latency spent just on chattering across the network.
2. It's relatively rare that you're using _just_ the SBC - more likely is that you have some peripherals, or some local storage. That limits where your pods can schedule, but because of #1, you still end up with dedicated nodes for dedicated functions.
I ended up pulling the plug on that project early, and went back to scheduling workloads manually. For instance, I have Transmission and Squid running on the Pi with the big flash drive. InfluxDB and Grafana live side by side, and also live next to the SDR (I take in some metrics by radio). It's all still containerized, just with manual `docker run`'s and versioned config files, instead of with Kubernetes.
My original reason for reviving it was for use as a whiteboard in Zoom calls, but there's no 32-bit Zoom app - and I'm sure screen sharing while decoding 15 people's video would've been out of the question anyway. So I run a VNC server on it, and share out a VNC session from my work laptop instead.
I've also hit the issue where I've had to compile software for x86 using modern build toolchains. It takes forever, and more often than not, I run out of RAM (only 1GB). To get myself out of a pinch, I've mounted a 16GB USB 2.0 flash drive as swap space. Sure, it makes compiling even the most basic software a multi-hour process, but where this machine isn't my daily driver, it's still easier (to me, at least) than cross-compiling.