Might be worth patching fail2ban to recognize the scrapers and block them in iptables.
I'm satisfied. Virmach has had ups and downs but their network is fast too.
If you want something Hetzner-like in North America, you might look at OVH. They have a data center in Beauharnois (BHS), Canada, which is near Quebec. It's not too different from using a server in the Northeast US.
That article is almost 4 months old and yeah, the internet in EU is better than in the US. But you can get US plans with plenty of bandwidth. I've been happy with buyvm.net and there are many others. Hang out on lowendspirit.com for a while to get a sense of things.
Why do I not want a Pixel? Expensive, poor battery life, batteries hard to replace, no headphone jack, no SD card slot, no stylus (that turns out to be surprisingly handy). Also too much AI crap. Yes there are some nice things about the Pixel too, but I ended up with a Moto G Stylus 5g (2023 model) and am quite happy with it. It has all the stuff I mentioned. The one Pixel feature I've sometimes missed is HDMI out of the USB-C port.
Usually you write the book with a text formatter and package the results in to an epub, so IDK if it's common to edit the epub directly.
The epub is just a zip file containing a metadata file and a bunch of simplified HTML files (one per chapter). So if you're comfortable editing HTML, or better yet writing scripts, you can probably slap together something simple that unpacks the epub, strips those images out of the pages, and re-packages the epub.
Wait, if you have the old edition on your kindle, do they reach into your kindle and change what is there? Or do they just change the version in the store to the new edition, preferably with a new ISBN, if Kindles have ISBN's?
I remember about the Roald Dahl thing and it seemed pretty clear which edition people would be getting. And some of this stuff (according to another internet poster I mean) may have been intended to keep the books in copyright longer rather than to merely mess with the content. Blyton died in 1968 so her stuff could enter the public domain in the next few decades otherwise. That's nefarious too.
I remember for sure that Huckleberry Finn had the N word. Maybe little kids shouldn't be reading it, I'm cool with that, though I read it as a kid myself. But grown-ups who do read it can deal with an unexpurgated version.
The company doesn't need to grow. It needs to roll back its original sin and become a user advocacy organization.
Scheme has call/cc but standard Lisp (i.e. Common Lisp) doesn't. Hmm, Rust async is like C++20 coroutines, so they can only yield from the outermost level of the task etc.? (Added: C Protothreads also come to mind). That sounds constraining even compared to the very lightweight Forth multitaskers of the 1970s. Python's original generators were like that, but they fixed them later to be stackful coroutines. ~~~And do you mean there is something like a jump table in the async task, going to every possible yield point in the task, such as any asynchronous i/o call? That could be larger than a stack frame, am I missing something?~~~ (No that wouldn't be needed, oops).
Setjmp/longjmp in C had some predecessor with a different name, that went all the way back to early Unix, way before C89. It was routinely used for error handling in C programs.
I've implemented Lisp (without call/cc) in C using longjmp to handle catch/throw. It wasn't bad. Emacs Lisp also works like that.
I had been pretty sure that delimited continuations were strictly less powerful than first-class continuations, but I'll look at the paper you linked.
I found some search hits saying you were supposed to implement signal handlers in Rust by setting a flag in the handler and then checking it manually all through the program. Even C lets you avoid that! It sounds painful, especially when there can be asynchronous exceptions such as arithmetic error traps (SIGFPE) that you want to treat sanely. But I haven't looked at any Rust code that does stuff like that yet.
Hmm, I wonder if it's feasible to use the Boehm garbage collection method in Rust, where the unsafe region is limited to the GC itself. Of course it would use pointer reversal to avoid unbounded stack growth. Of course I don't know if it's feasible to do that in Ada either.
Longjmp in C is generally used for implementing exceptions or things of that sort, which is fine. Even Ada and Haskell have exceptions. C++ has them too, though maybe that doesn't speak in their favor as much. Rust lacks them, but so far that seems to me to be a shortcoming in Rust. Even those wanting unwinding of error value checking through the entire call stack could look at the C++ deterministic exception proposal which is similar to Haskell's ErrorT monad transformer.
This is worth reading about Haskell if such topics are of interest: https://research.microsoft.com/en-us/um/people/simonpj/papers/marktoberdorf/mark.pdf
Anyway, Rust has its own sort of call/cc thing as far as I can tell (not sure), in its async runtimes. There is a coroutine switching scheme underneath that, amirite? Where do the call stacks for the different async tasks live and how are they allocated? I've been wondering, "Comprehensive Rust" doesn't go into any detail about this.
Call/cc in its most general form is possibly evil, but delimited continuations, the most common use of call/cc, are perfectly cromulent as far as I know. My brain is not currently big enough to understand the topic but I'm going by some of Oleg Kiselyov's old writings, probably linked from here: https://okmij.org/ftp/continuations/index.html
Graphene is only for Pixel phones. That's been enough to stop me from pursuing it.
California recently voted down a public referendum to end the penal exception to the 13th amendment. So they will still have incarcerated workers working for pennies an hour, just in jobs other than firefighting. Still not good.
https://en.m.wikipedia.org/wiki/Narcissistic_personality_disorder