HN user

EvilTerran

1,298 karma
Posts1
Comments483
View on HN

Back when I played Minecraft, I wrote one I was pretty pleased with:

If you have a stack of items, you can pick up half of them by right-clicking on it, which is very convenient when you're dividing out a stack on the crafting grid to make many copies of a recipe that needs that item in 2 or 4 slots; but for some recipes, you need to put the same item in 3 or 6 slots, and there's no built-in way to divide a stack into thirds.

So I made an AHK script that, when I held down a key, would

- pick up half of the items in the stack I'm pointing at (right-click) - move the mouse one inventory space to the right - put them down (left-click) - pick up half of them again - move back one inventory space left - put them down, adding them back to the original stack - and repeat

and it would only stop after one of the "pick up" steps; so, after a few iterations, you'd be left with the stack divided into equal thirds, two in your inventory & one on the mouse.

Eg, starting with a stack of 60, it goes 30/30, 45/15, 22/38, 41/19, 20/40, 40/20, 20/40, 40/20... then release the key, and you've got three stacks of 20.

Others have already mentioned that you can replace "for (const k in props) elem[k] = props[k]" with "Object.assign(elem, props)"; further to that, in modern browsers, you can replace "for (const kid of kids) elem.appendChild(kid)" with just "elem.append(...kids)" - with the added benefit that plain strings passed to .append() get turned into text nodes automatically, so you probably wouldn't need $T any more:

https://developer.mozilla.org/en-US/docs/Web/API/ParentNode/...

I guess you could send changes to the DB on-the-fly inside a transaction, so when the user clicks "save" it's just a matter of running COMMIT? Not sure what effect that would have on performance as the transaction grows, though.

I believe you're thinking of the "Facebook Container" addon - it's "official", in that it's made by people at Mozilla & has their corporate blessing, but it's not installed by default.

AIUI, the only "container" functionality built-in to the browser is... infrastructure, I guess you'd call it: Firefox provides all the tools for addons to do stuff with containers, but doesn't actually do anything with them itself.

Could you not use permissions.request() [0] to ask for access to a given site on-the-fly, when the user actually visits it? That seems to be how, for example, Reddit Enhancement Suite goes about getting perms for all the various sites it supports embedding content from (imgur, twitter etc) - you get a prompt when you click to open an embed for a site you haven't granted the permission for already.

[0] https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Web...

I find PCRE's rule easy enough: for a character you want to be taken literally, if it's punctuation backslash it, if it's not then don't; any unbackslashed punctuation (or backslashed non-punctuation) may be a metacharacter.

Compare to, say, POSIX or Vim[0] REs, where some punctuation characters are special with a backslash, others are special without, and I can never remember which is which.

[0] Regardless of the state of the "magic" option - the only way to get consistent behavior is to start every single RE with either \v (which works like PCRE) or \V (which works like your proposal).

For instance most spray cleaners come in bottles made of high-density polyethylene, which can be readily recycled. But first consumers must remove the spraytops, as they are made from different plastics and are not recyclable. Then consumers must find a way to pry off the brightly-colored, printed plastic wraps that packagers are increasingly wrapping around bottles to make the labeling more attractive.

“Who does all that? Nobody,” said Sanborn.

I do! It's a little fiddly, but any sharp knife with a point you can slip under the label does a good enough job of slicing those off.

Good to know that helps, actually - I've often wondered whether I was wasting my time bothering with it.

So I changed the z-index of Div A to be 5 or something. But it didn’t work! In Firefox, div A was on top, but in Chrome, Div B was on top. Argh! Why?

... why indeed? I can't think of any (presumably fairly simple) scenario where that would happen.

Sure, I don't disagree - I meant only to add context for anyone reading who was unfamiliar with Haskell, lest they come away with the impression that the lack of a .get()-equivalent was some kind of egregious oversight.

if you're reducing the list to a scalar, you lose all the benefits this article wants to claim.

Not quite - for example, these both benefit from foldr, despite each producing a scalar:

  and, or :: [Bool] -> Bool
  and = foldr (&&) True
  or = foldr (||) False
... as they can both "bail out early" without evaluating the entire list (if they find a False or a True, respectively).

The distinction lies not so much in "are you reducing to a scalar?" as "can your binary operation be productive without evaluating its second parameter?" - or, if you prefer, "is it ever lazy in its second parameter?". If so, then foldr may be appropriate.

The point, as I understand it, is that we've found cases of galaxies that look like they should be about the same mass as each other based on the light they're putting out themselves, but gravitational lensing measurements indicate a significant mass discrepancy. That's what's hard to explain without "maybe there's a bunch of matter we can't see" - if it was more of a "maybe gravity just works differently at galactic scales" situation, that scenario would be impossible.

Here's one: https://www.jneurosci.org/content/25/38/8593

Abstract:

Nicotine is the major neuroactive compound of tobacco, which has, by itself, weak reinforcing properties. It is known that levels of the enzymes monoamine oxidase A (MAO-A) and MAO-B are reduced in the platelets and brains of smokers and that substances, other than nicotine, present in tobacco smoke have MAO-inhibitory activities. Here, we report that inhibition of MAO dramatically and specifically increases the motivation to self-administer nicotine in rats. These effects were more prominent in rats selected for high responsiveness to novelty than in rats with low responsiveness to novelty. The results suggest that the inhibition of MAO activity by compounds present in tobacco smoke may combine with nicotine to produce the intense reinforcing properties of cigarette smoking that lead to addiction.

That's just known expenditures by the Internet Research Agency, though. For a full accounting, you'd not only need to know if that was all the IRA spent, you'd also need to include, say... how much Russia spent on hacking into the DNC's emails, and into 39 states' election infrastructure[1]; how much value they extracted from the polling data Manafort sent their way[2]; etc.

And even with all costs taken into account, it took a perfect storm of factors outside their control for their actions to actually change the result. I doubt they even expected that outcome themselves.

[1] https://www.bloomberg.com/news/articles/2017-06-13/russian-b...

[2] https://www.theatlantic.com/politics/archive/2019/03/mueller...

I have a similar problem on my firefox-on-android: when I load a mobile.twitter link, it usually pinwheels for a bit, then throws up an error - either "you're rate limited" or just "something went wrong" (or, occasionally, it just pinwheels forever); then, regardless of which way it failed, loading the page a second time almost always works - but only if I do a proper reload from the browser UI, the in-page "try again" button doesn't help.

I figure something's timing out on the first attempt, but various bits get downloaded & cached before it fails, meaning the second try runs fast enough to not hit the same timeout.

Security Update 7 years ago

When a user whose password is hashed the old way logs in, after checking the password they just supplied against your stored old hash but before forgetting the plaintext, you can compute the new hash & update your records.

Of course, that only works for active users - it won't upgrade anyone that never logs in. Depending on just how weak the old hash is, you may want to eventually cut off any lingering un-upgraded accounts: just forget their old hash, requiring them to go through your password reset process should they ever come back. If you've left it long enough, those accounts will probably never be used again anyway, so that should be NBD.

Well, true, but all this is a lot more conspicuously fishy than "flip a setting that the user might have legitimately flipped themselves". You're not going to get far hiding a whole new Firefox install in $HOME before someone asks why theirs suddenly got 200MB bigger, for one thing.

That very page acknowledges your concern & presents their counterargument - namely, they consider security software to be part of the Windows model, and expect that to intervene in the case of modified binaries:

By baking the signing requirement into the executable these programs will either have to submit to our review process or take the blatant malware step of replacing or altering Firefox. We are sure some will take that step, but it won’t be an attractive option for a Fortune 500 plugin vendor, popular download sites, or the laptop vendor involved in distributing Superfish. For the ones who do, we hope that modifying another program’s executable code is blatant enough that security software vendors will take action and stop letting these programs hide behind terms buried in their user-hostile EULAs.

(emphasis mine)