Hacker News new | ask | show | jobs
by hx2a 1915 days ago
A reason to use old computers that I don't see mentioned here has to do with accessibility. People in the US usually have current hardware such as the latest Mac laptop, but that is not the case in all other countries. Current hardware is a bit of a luxury that we don't fully appreciate.

I have an open source project with global users, and one person in Mexico contacted me looking for help. He was trying to create 3D visualizations of MRI brain scans and was running it on an old computer that hardly anybody in the US would consider using. Happily I had done testing on an old laptop and much performance tuning during my development. I was able to help him get his project working. It was still slow, but at least it was usable. It wouldn't have been if my code only worked on current hardware.

5 comments

A couple of the web sites I maintain have a primary audience of poor, largely immigrant, people with a fifth-grade education and only rudimentary English.

The server logs show most of the connections come from people using what people on HN would consider toy or throwaway convenience store phones. The high-end is people on Windows XP.

(The sites are in the healthcare space, and if one of our clients is really so desperately poor that they can't even afford a smartphone, we'll give them either a laptop and a hotspot, or a smartphone, so they can access the web sites. We pay for their connection.)

I think tech people should get their funds together and uplift everyone on the planet. Today we have modern speedy hardware that is just as cheap... And it would add huge demand to software.
Even if we give everyone a $1000 laptop, we will create the following pitfalls:

-people don't know how to use them (and I mean even all the people living in the EU know how to use a desktop/laptop - and I don't mean just the old)

-people that are not educated will start clicking left right and center, their computers will be infested/compromised in one day, good luck supporting them. If you don't support them, you just helped create an extra 1bn zombie network

-most areas don't have adequate infrastructure or even no infrastructure at all, in many locations in EU, you 'feel' it when kids begin online classes. Suddenly the countries' networks get flooded with 1-2-5 million streams. I am not saying to leave areas in the dark forever, but it is a slow progress to expand/include all geographies, it takes time, and the need creates the work. We cannot force-invest to bring fast internet in remote locations just for the sake of bringing it to them.

-tech people make and spend money. Preference is give to 'make'. Making an investment of $100bn with a potential revenue of $1tn sounds good. By why would (e.g.) Lenovo donate $50bn worth of laptops? How will they recover this amount when their software sales are negligible? Will they track (spy) everyone to generate revenue? Will (e.g.) Microsoft sponsor those laptops, that will then 'monetize' (spy) to recover the costs?

so many more points/questions.. I will stop here..

Plus, if you give them a $1000 laptop, they'll sell it, buy a cheap phone, and use the remainder to buy something that serves a more pressing need.
That means somebody bought it - presumably someone who doesn't have any other computing device and wasn't awarded one.

Also, $1000 is way too much, I was thinking in terms of $150.

Related to this: one of the very few good reasons to offer unencrypted HTTP is that in some parts of the world, old devices are in widespread use, and support for modern HTTPS cannot be taken for granted.
And older phones might have certificate stores that can't be upgraded and have already expired.
It’s kinda annoying that I can barely use my 2013 iPad Mini because of this kind of issue, even though I absolutely love that thing (I even used it as my primary smartphone using voip for a few years!).
Are you sure that's the issue, and not cipher/protocol support? The root CA needed for lets encrypt is "DST Root CA X3" which is supported by iOS 7 https://support.apple.com/en-ca/HT203065 (and has a validity start date in 2000, so i imagine goes earlier). Now there are lots of other CAs, but lets encrypt is probably the most popular, i would be kind of surprised that the root certificate store is the limiting factor as opposed to not supporting any GCM ciphers
I have the same problem with a BlackBerry Playbook tablet - great form factor but it doesn’t handle websites using modern SSL.

I believe you can work around this using another machine as an SSL proxy - though setting that up is beyond my ability. Perhaps someone else can elaborate?

Indeed, proxies can work around the problem. I made this for Macs, but you could run it on a Mac and connect from a Playbook, or set up Squid yourself on a Raspberry Pi. https://jonathanalland.com/legacy-mac-proxy.html
I’ve used Squid as a filtering proxy in the past. Unfortunately, I don’t have a Mac, but this:

https://dev.to/suntong/squid-proxy-and-ssl-interception-1oa4

- looks like it might be a useful guide for setting it up as an SSL proxy.

I know Google tried to address this by giving Chrome its own independently upgradable certificate store and thought Apple would do something similar, especially since they don't have to rely on OEMs to push system updates.
if it's a limited number of Root CA certs that are not supported, you can likely install those manually.
Or the server only accepts modern ciphers or TLS.

I took a deep dive into this after I was unable to access my blog on my iOS 6 device. I concluded that I don't really need a ssllab's A. It is much more likely someone will try visiting my blog with a older device than someone will MITM one of the visitors.

https://blog.nyman.re/2021/02/07/usability-security.html

Interesting write up, thanks for sharing it.
How many of those are old enough that they can't download firefox?

(I realize this sounds snobby. I'm mostly just actually curious how much that is a viable option)

About years ago I saw a phone that could no longer connect to Play Store, probably because of lacking support for newer TLS versions. It was a rebranded Chinese phone, with no firmware update available.

I managed to install Firefox and a couple of apps by transferring the APKs from my phone using Bluetooth, but it's a popular brand in my country and I'm sure a lot of people are in the same situation.

I actually dug out my old Nexus One last week because I had an idea for a project and yeah, can't do anything on that phone anymore. It still connects to my WiFi, but it can't open Google play any more and of course there are no updates available to make it work. Most websites don't open in the browser.

Funnily enough, Google maps still work. I'm impressed that their APIs have remained the same for a very long time now.

And yes, I can probably still install APKs manually or find a custom firmware with more modern version of Android where Google play will work. But that requires certain amount of skill and time, so for most owners this phone is only slightly more functional than a dumbphone.

I’ve heard this complaint before, but couldn’t you just put an HTTPS to HTTP proxy somewhere with good bandwidth to cut out the latency without hurting the security of people with good bandwidth/devices? Sure, a proxy costs money, but it’s not much compared to other infrastructure costs and it could be shared.
Honestly never considered that. Thanks
my personal rule of thumb is that my software must be useable at -O0 with address sanitizers on my desktop - so far that has meant that at -O3 it stays useable on raspberry pi-3 level hardware.

A few months ago I tried to make a build which targetted ivybridge-level CPUs, it took no more than one day for a few users to report that it didn't work on their machines, turns out a lot of people still rock some old AMD Phenom or Q6600-era machines

> my personal rule of thumb is that my software must be useable at -O0 with address sanitizers on my desktop

The trouble with this criterion is that it fundamentally alters the language from the ground-up: it forces you to optimize the source code structure for this too, not just run-time performance. Specifically, one of the core strengths of C++ is that no matter how many (practical) levels of wrapping and forwarding you do, as long as they're simple, they can generally all get flattened and go away with optimizations like inlining. But if you don't enable optimizations, now every indirection in your source code will cost you—even absolutely trivial things, like std::move() or std::forward(), that should be 100% free. This obviously hampers your ability to design good C++ abstractions, and, basically, turns C++ into a different language (like Javascript or Python). It seems rather suboptimal. (Do you not encounter these issues in your particular application?)

What I would probably prefer in your situation is to change the criteria somewhat, by doing things like keeping ASAN, enabling some debug-mode facilities (like ITERATOR_DEBUG_LEVEL=1 for MSVC), but also enabling some optimizations for inlining and such so that you don't fundamentally alter the language like this. And/or you can just slow down your CPU when testing (in Windows you can just set the max CPU speed in Advanced Power Options).

Presumably they still optimize and write for -O3, just that they run far slower version.

Without any manual optimization targeting O0.

(main negative is that missing performance degradation appearing in 03 ut not O0 may be harder to notice)

> : it forces you to optimize the source code structure for this too,

I thought that it would but on my dev machine (a broadwell 6900k, still pretty good but definitely not top of the line) I actually have to push it a fair bit to have this be an issue (which is why it is important to do it ! because low-power computer are really low-power compared to that), so this question definitely does not come up during the design (which is in my case generally very template-y and subject to the issues you mention). For reference, the app in question is https://ossia.io

The cases where doing this led to changes in code were more in the lines of "welp, looks like this algorithm I implemented for rendering waveforms is damn inefficient", "gonna have to think if I can redraw this widget less", "I should really cache the results of this computation", etc.

Interesting, I guess it depends on your application. :-) You made me go back and double-check this on an actual program I had; here's what it is as a comparison point:

So I have an application in front of me right now that I've already optimized the heck out of (and it's as close to single-pass as can be), and turning off optimizations in release mode makes a basic 0.27-second task take 2.4 seconds... almost an order of magnitude difference.

And when I try to break into the code to see where it stops, it's almost always within traditionally-very-cheap operations like std::vector::emplace_back

  1 std::vector::emplace_back
  2 std::vector::_Emplace_back_with_unused_capacity
  3 std::_Default_allocator_traits::construct
  4 T::T
  5 U::V::w
and std::lower_bound

  1 std::lower_bound
  2 std::lower_bound
  3 std::_Seek_wrapped
  4 std::_Vector_const_iterator::_Seek_to
which have suddenly become incredibly expensive due to lack of optimizations like inlining. And notice this is all in the standard library, not within my own (template-light) code.

Going from 0.27 seconds (near-instantaneous for the user) to 2.4 seconds (a huge lag) is enough to make the program incredibly frustrating. Whether it's still "usable" at that point I guess is a matter of debate (some devs just put up with any amount of lag you throw at them!), but I feel pretty safe in saying the task I'm trying to accomplish simply would not be possible without optimizations.

So I'm guessing your performance targets & constraints are quite different, and that's probably why this isn't such a big deal in your case.

I've still got some SandyBridge-era computers running.
My PC is a dualcore intel thing with 8 gigabytes of RAM. It's 12 years old. It was 2 gigabytes of RAM when I bought it and I have added an SSD some years ago and upgraded the Gfx card. It is still perfectly usable for my job (writing code, word processing, web dev). When I have bigger task, I design them on it and move them to online CPU/GPU if needed.

So it's quite a durable product and I'm proud of it.

Using Linux helps as it doesn't need 1 more gigabyte or RAM each time I upgrade it. And my emacs just consume the same amount of RAM as years ago. Very predictable.

Likewise. A dual C2Q Mac Pro, Nehalem and Westmere Xeons, and a Sandy Bridge NAS. Newest non-embedded x86 in the house is probably my 2017 MacBook Air. I did buy an M1 Mac, but why would I replace our perfectly performant desktops that we only need occasionally for e.g. CAD or video editing or whatever when they still work absolutely fine? It's not a lack of money, it's a question of priorities. I have yet to find the killer app that's going to force my hand. It seems likely that hardware failure will get them first.
You just reminded me that I've also got a Core 2 Duo Mac running, as well. That thing can run games better than my Mac that came out a decade later. Might have something to do with the enormous caches on the Core 2 series versus later Intel Core releases.

I also agree with your reasoning. These computers have been serving their purposes for a while, and I see no reason to take the time to replace them.

Yeah, SFF PC of that era can be had for sometimes RPi-level prices. My grandma has one and it's still more powerful than most low-end laptops people use. I've also got one as a home server, it's plenty powerful for that too. I'd recommend them to anyone who "just wants a pc".
> -O0 with address sanitizers on my desktop

> that at -O3

What does this notation mean?

Optimization levels for C compilers like GCC and Clang.
Specifically the command line flags you would pass to the compiler.
Technically, couldn't he install a very lightweight Linux distribution.

I have a few Raspberry Pi zeros and I actually enjoy coding within the limitations of said hardware, when you know you only have 500 megs of RAM on the device you have to solve problems differently

"Only"... My first Linux system had 3 megabytes of RAM! I was running SLS Linux on a 386SX/20.
The old refrain:

EMACS - Eight Megabytes And Constantly Swapping

:) 16mb on my first computer and that had Win95 (then redhat linux)
I like how cushy we have it when 500Megs are considered 'only'. I appreciate nowadays even tetris runs on 6GB but if the software is written well, 500MB is a lot of memory to use.
Modern hardware has allowed us to ignore bad/inefficient coding. That aside from the need to compute larger data sets is the ONLY reason we keep needing more RAM and CPU with every coming year. If software companies would stop rebuilding everything from scratch as a product model and instead do it only when absolutely necessary and just work on improving the EXISTING software, most things could run on an OS with 2G of ram. There is no good reason for needing to continually upgrade hardware just to browse the internet. The reason it’s needed is because each year developers and designers assume that their userbase has better hardware so they can be wasteful with resources and not optimize.
This would drive down developer costs though wouldn't it?
Depends on the type of developer. With the increase in high level frameworks there are a lot of developers who never learn why the code they are using is bad. Development of anything is rarely involved in the libraries they use. They just import a blob and make it do stuff. A lot of times sites and web apps are scraped together from crap from stack overflow and it just barely works. There have been many cases of core library developers doing something stupid and avoidable that slows all resulting programs down.
My first computer was a Timex 2068.

With 500 MB the world is boundless.

If you want to experiment with constraints get a ESP32.

Why would anyone need more than one 5.25" floppy disk?

It's got 160KB!

Well, compared with 3" microdrive it is a lot! :)
Ha! 3" or Microdrive? They were different things.

The ZX Microdrive was the Sinclair stringy-floppy, released 1983, giving approx. 85-95 kB per cartridge: https://en.wikipedia.org/wiki/ZX_Microdrive

But 3" was a true floppy disk, used in e.g. the Amstrad Spectrum +3, released 1987, where it gave 180 kB per side: https://www.old-computers.com/museum/computer.asp?c=222

I love that people are still making enhancements for these ancient machines. For example, Amstrad promised an add-on disk interface for the cassette-based Spectrum +2, but never shipped one. Now, the nonexistent hardware has been cloned and you can buy a new one!

https://www.8bits4ever.net/product-page/sdi-1

There's an SD-card based replacement mechanism for the original Microdrive:

https://vdrivezx.com/vdrivezx/

I meant the Amstrad Spectrum +3 one.

I was envy of a friend that had one due to CP/M support.

There is something special about the Pi that makes an “oh well, time to reflash and start again” a non-disaster.

They are great and hacking about with them is fun, even when disaster strikes.

My version control on the Pi is different SD cards, I just copy the stable versions over and rotate. It’s fun :)
What's the best way to backup the actual sd card. I plan to store it on the cloud. I tried using Windisk 32 and it didn't work .
I’ve used Pi Baker on the Mac.

It kind of hurts that the image is the same size as the SD card when the card might be pretty much empty, but it does make recovery easier.

Write zeros to the empty space (many method available- make a big file of zeros or something and delete it) - then your image of the SD card should compress really well.
Great suggestion.

Actually I think rpi clone can clone down to a smaller sd card

https://github.com/billw2/rpi-clone

You could clone down to like a 4 gig SD card, and then back up that SD card.

For some reason I find "only have 500megs of RAM" very amusing. Many/most modern laptops only have 8-16 times more RAM than that. I'm genuinely curious what problems you're working where that "limitation" is your bottleneck and not the processor speed (which at 1GHz is still pretty speedy for many/most tasks other than pure computation (e.g. machine learning training and processing large datasets for statistics)). I'm also assuming you're treating it as a dedicated tool, and not doing tasks while running a DE and web browser at the same time.
I think if you require users to bring their own computer, you can be insulated enough from hardware costs to not really care about memory usage, and that's mostly fine. I have worked on set top boxes at an ISP. We designed and manufactured the hardware; if we could get away with 512MB of RAM instead of 1GB of RAM, that was basically pure profit for us. So some attention was paid to memory use, because it had a real dollar cost associated with it. (I guess I'll point out that the engineering samples had a gig of RAM, and someone got the idea to write the UI in Dart running inside Chrome instead of the very legacy Java that we had on the previous hardware generation... so the production models did not ship with 512MB of RAM.)

To some extent, being careful about memory usage is not the only way to make the business work -- you could, after all, charge more for the service or make people buy the CPE outright. But, being an ISP mostly involves getting enough people to buy the service to make it worth digging up a neighborhood to run fiber; you don't want to sour the deal by costing more than the competition with less able CPE. Doubling the RAM available to software engineers may improve the user experience by more than 100%, but nobody picks their ISP for the software than runs on their TV box, so it's probably wise to be careful.

My point here is that some programmers do have to care about memory usage. If you include a computer as part of your product, you will someday be looking at the BOM cost of the bundled computer in an attempt to turn cost into profit.

I’ve found that when working on things like this it’s better to make the engineering samples half HALF the RAM instead of double - it encourages minimalism.
Yeah, that's why I mentioned it. It is hard to commit to cost reduction. The hardware engineers don't want to do a bunch of work, just to have their project fail over 512MB of RAM. The software engineers and PMs will always want more features.

I think the devices are still in the field and being issued to new customers 5+ years later, so maybe it was the right decision.

I didn't say that paying attention to memory use wasn't important. I was more just curious about what kind of task 512MB of RAM is limiting for.
Browsing "modern" websites for one
Ram tends to create issues when you're building stuff locally.

I used ram as an off hand example of something which is limited.

I actually did go out and buy a Raspberry Pi 4 8gb since I want to start processing some machine learning, and the 512 on the Zero won't cut it

A lot of young people use hand-me-down computers, even in developed countries.

I was just playing Unreal Tournament with the homestay family children, on WinXP. One of their friends asked "Is this like Fornite?" and I felt like I'm getting old. I was there when UT was new! Fornite runs on the Unreal Engine!

On that note though, it would be really great to have a new game for Windows XP.