Comment Re:Social engineering redux (Score 1) 18
You know one of the pitches for these things is "They're immune to social engineering..."
Really? I've never, ever heard that pitch for AI.
You know one of the pitches for these things is "They're immune to social engineering..."
Really? I've never, ever heard that pitch for AI.
Thanks for this, I, in proud slashdot tradition, did not read the article, but it was my layperson's understanding that it'd have been a bit more dramatic if it had reversed... like a pole flip or something.
Also, the amount of energy required to reverse it... it's hard to see where that could possibly have come from.
Labeling your item with a generic "BOMB" is such a rookie mistake. Always - always! - use more descriptive bluetooth name so you know exactly which device you are controlling. E.g., "cmdrtaco's BOMB".
The name of the product is "Bomb", and "Bomb" is the default Bluetooth name.
I don't know whether that makes you advice invalid, or all the more salient.
Oops. Did I just make Slashdot do a U-turn?
ROTFL
Social engineering redux... except now you only have to convince a sycophantic and overly helpful AI.
Many people incorrectly think of proxies and VPNs (especially VPNs) as a security and privacy enhancement, but unless you're operating the proxy/VPN server yourself they're just as likely to be a massive security and privacy risk. The problem is that they concentrate all of the traffic you'd most like to keep secret in one server, and depending on exactly how the system works, may require installing software on your local machine with ~root permissions. If the operator is malicious, this is a really dangerous combination.
These are useful tools for location shifting and -- in fairly rare cases, and with VPNs only -- from hiding traffic from malicious. But third-party proxy/VPN services should always be viewed with suspicion. Obviously this is even more true when the provider is Russian... though it's pretty likely that wasn't made clear to the people who used the service.
Just how insane he is.
Not insane at all, just uninterested in the well-being of anyone other than himself.
That's what insane is. Basic principles of morality "Do no harm" and "Take action to prevent harm" mean nothing to someone who is insane.
Sanity and morality are orthogonal.
How so?
A person can be sane and immoral, sane and moral, insane and immoral or insane and moral. "Orthogonal" is perhaps a little too strong, since it implies the absence of any relationship, but certainly all the combinations are possible.
*head bangs in approval*
Oh, forgot to link the dry density for you: here you go. 341kcal/100g. Aka 3,41kcal/g.
Which, like I said, should be obvious, since they're almost entirely carbs (~4kcal/g) and protein (~4kcal/g), and they're, as noted, dry (12-16% moisture). It would be quite the trick indeed to get something that is dry and and is almost entirely comprised of things that are 4kcal/g to be 1,38kcal/g!
Just in case you need help:
Your calculation: 195g (dry weight) × 1.38 kcal/g = 269 calories per pound of cooked beans.
Correction: Because you used 1.38 kcal/g (the cooked density) as if it were the dry density, you essentially diluted the calories twice.
The Actual Math: 195g of dry beans * 3.4 kcal/g (actual dry density) = 663 kcal.
When those 195g of dry beans absorb water to weigh 454g (1 pound), they still contain those same 663 calories (since water has zero calories).
Canned beans are ALREADY COOKED. *facepalm*. You can eat them straight out of the can.
which is waaaay more than I would want to eat at a sitting.
I can't think of a single ingredient - any ingredient - that I would want to eat exclusively as my diet, so this is a really stupid argument.
Just how insane he is.
Not insane at all, just uninterested in the well-being of anyone other than himself.
That's what insane is. Basic principles of morality "Do no harm" and "Take action to prevent harm" mean nothing to someone who is insane.
Sanity and morality are orthogonal.
heapless is quite useful in many contexts, yes.
As for what my design goals are, it's a pretty typical LRU map. I assumed that the name would tell you what the purpose is, but perhaps not. Please excuse me for belaboring if you are already familiar with these concepts; I don't know what you know, so I figure it's better to be clear. If you do, skip the next paragraph.
An LRU (Least Recently Used) cache is a cache that has a fixed maximum size and when a new item is added that would cause it to exceed that upper bound, it discards the "oldest" entry in the cache, where "oldest" is defined as least-recently used. An LRU map is similar but it is "primary storage" not cache, but still with a fixed capacity so when you try to put more in it than it can hold it has to discard something, and it does that by discarding the least-recently used item.
In my case, I'm writing code that services client code running on other CPUs in the same SoC. The client transactions are moderately long-running, each involving a sequence of requests delivered over the course of a few seconds, though some sessions legitimately go much, much, longer, and each such session requires me to track a non-trivial amount of state, not so much for efficiency as for security; I can't hand the internal state back to the caller because that might allow an attacker to mutate it or roll it back (if rollback weren't a concern, I could outsource a MACed copy of the state). I keep the operation state in a map structure, keyed by an operation ID. But clients can die and clients can misbehave, so I can't safely rely on the clients to always send me the termination message that allows me to clear the operation state.
So, I need some way to ensure that my map doesn't fill up with stale operation data, preventing new operations from being started. LRU eviction is a cheap and effective method. But this means that sometimes clients are going to send a request for an operation that I have evicted, so I have to return an error message. I could just always say "Operation ID not found", but then clients have no way to distinguish between cases where they just waited too long and cases where I suffered a failure or was reset. The clients often respond to these different failure modes in different ways.
For that reason, I keep a "recently-evicted" list -- but that also has to have a fixed size limit. In practice, my recently-evicted list consists of two lists, an "old generation" list and a "new generation" list, both with fixed size limits. Every time an operation is evicted, it's added to the "new generation" list. When the new-gen list is full, I move it to the old-gen list (in practice, I really just change which list is considered new and which old; no need to copy it). This is a cheap way to "age" the eviction records, without actually having to track their age in an LRU fashion (which would ~double the per-entry storage required, halving the number of evictions I can track). When a request for an unknown operation ID comes in, I search both lists to see if the ID has been recently evicted. If so, I remove the ID from the list and report the error to the caller. The reason for removing is to make space for a new eviction record, to maximize the scenarios in which I can notify clients.
Regarding your comment about encapsulation being overused... this is not such a case. The purpose of encapsulation, properly applied, is invariant maintenance, and there are some important invariants that have to be maintained for the LRU map to work. One of those is that insertion must execute the eviction logic, so even if I could move the map out temporarily, that would create an opportunity for bugs if the calling code does not correctly handle eviction and maintenance of the recently-evicted list. Another (less crucial, but still important) is that the recently-evicted list should only contain entries for clients that haven't yet been notified.
That said, there actually a good argument that the `recently_evicted` method is conceptually non-mutating and I should use interior mutability. Either that or I should rename it to "remove_eviction_record", so it's clear that it is inherently a mutating operation. I will do one of those two things on Monday -- thanks for helping to improve my code. I would prefer the rename for clearer semantics, but interior mutability will allow me to avoid the extra map lookup, so I'm leaning that way.
One other comment about something you said, which you might find interesting: You said that in Rust, moves are cheap. This isn't really true. More precisely, it isn't any more or less true in Rust than in any other language. Regardless of language, when you move data, you must copy it, and you're paying the cost of that copy. What makes moves so useful in Rust is not that they're cheaper in time or space but because of the marvelous move invariant that is enforced by the compiler. Namely, that moved-from values cannot be referenced.
To see how important that is, compare with C++, which also allegedly supports move semantics. The modern C++ style makes heavy use of move semantics. But C++'s move semantics are broken in a way that makes them less efficient and more difficult to use safely, and that's because C++, like C, always allows code to reference any value that has a name. That means that moved-from values can be referenced, which means it's critical that moved-from memory not be left in an invalid state when interpreted under the invariants of its type. So the rule is that moved-from C++ objects must be left in a "valid but unspecified state". In practice, this translates into the move ctor/optor having to do work in the moved-from memory, zeroing pointers and whatnot, in order to ensure that what's left behind upholds the invariants of the type, and it means that C++ structs that support move-from must have some valid but not semantically-significant state they can be in.
What makes Rust's move semantics easier to work with, more efficient and safe is that there's no need to ensure that the moved-from memory is in any kind of valid state, because the compiler will not allow the moved-from memory to be accessed. Another way to think about it is that the moved-from memory no longer has any type, so no longer has to maintain any type invariants. It's fine to leave behind bit patterns that used to be pointers or whatever, because those bit patterns will never be used.
Coming from 35 years of C++ programming, this was something of a revelation to me when it hit me a few months ago. And it's the real meaning of "moves are cheap", which isn't a comment about time or space, but a comment about invariant maintenance.
In general, "damping pleasure" is not most people's experience with GLP-1 agonists. What it does is more like separate pleasurable experiences from having an urgent need to continue doing them.
I'd believe the Iceland numbers. I had a doctor once who wanted to get me on antidepressants, and got mad when I didn't want to, and completely ignored my pleadings of "But I'm not depressed", "I enjoy life", "I'm probably the least depressed person you'll meet", etc. He just really liked his patients to be on it. The Icelandic medical system is very into anything that "medicates symptoms" rather than treating diseases. For example, during COVID, it was essentially impossible to get drugs like paxlovid, but they made parkodín (tylenol with codeine) over-the-counter.
In most modern societies medication is usually a last resort.
I'm going to take a wager that if I were to open your medicine cabinet right now, there would be painkillers in it, which you take as will when you get headaches, body aches, etc.
Yes, different people have different baseline hunger levels. This is well accepted in the scientific community.
Shortest distance between two jokes = A straight line