519 karma · joined February 13, 2014
Put `HN` in the subject line so it doesn't go to spam ;)
Either way I'm excited to be able to generalize over asyncness.
*EDIT*: I now see that they explicitly address this question in the post:
> The short answer is: kind of, but not really. "Effect systems" or "algebraic effect systems" generally have a lot of surface area. A common example of what effects allow you to do is implement your own try/catch mechanism. What we're working on is intentionally limited to built-in keywords only, and wouldn't allow you to implement anything like that at all.
> What we do share with effect systems is that we're integrating modifier keywords more directly into the type system. Modifier keywords like async are often referred to as "effects", so being able to be conditional over them in composable ways effectively gives us an "effect algebra". But that's very different from "generalized effect systems" in other languages.
From a utilitarian standpoint it makes sense :shrug:
Same principle also applies if you’re trying to put a future in a struct (to create a named future). One of the fields will have more or less that type. This is useful for a few reasons (e.g. making it easy to refer to a specific future in type signatures or for writing futures out by hand).
Meanwhile my experience with Go has been the reverse. I’ve found it acceptable for most use cases, but for network services it really stands out. Goroutines <3
There's a fine line between so descriptive that the AI hits an edge case and can't get out of it (so every attempt looks the same) and not being descriptive enough (so you can't capture the output you're looking for). DALL-E is already incredibly fast compared to public models and I can't wait for the next order-of-magnitude improvement in generation speed.
Real-time traversal of the generation space is absolutely key for getting the output you want. The feedback loop needs to be as quick as possible, just like with programming.
2. Prefer dynamic dispatch to monomorphization (i.e., use fewer generics).
3. Don't use proc macros (i.e., don't depend on the `syn` crate, even transitively).
Easy to say; hard to put into practice. But that's all there is to it.
Personally I think the understated way in which Rust now maintains a death grip on the WASM tool chain and tooling is the answer. Let the web devs have their JS. We can have everything `<canvas>` and below.
It tells you what’s wrong, you fix it, you move on. It’s no different than forgetting a semicolon in Java.
Nothing needs to be undone after. Either those 4 tools get you a valid program or you made a logic mistake you would’ve made in any other language. Or in Rust sans borrow checker. I don’t see how that’s an issue.
I don’t see how my methods are spurious objections or how I’ve spuriously objected to anything. My methods are tested, tried, and proven to work on a sample of n=1.
All that’s left is government funding and we can start mass human trials next month.
The docs don’t advocate this approach. Presumably because they favour correctness and understanding over blind hacks. I get why the docs are the way they are but I don’t think it’s worth the blood sacrifice necessary to stay on Mr. Borrow Checker’s Wild Ride.
Note that the above advice is no longer a 100% hammer-fits-all solution because futures and async and pin have unleashed brand new eldritch horrors upon us.
The “U.S. average energy mix” comparison of 14,800 is much more accurate.
Not to mention the equation gets more and more favourable to EVs with each passing year.
I'm now running the machine headless in the Parallels VM, and using VS Code on the host to Remote SSH into the machine. It's absolutely incredible and I highly recommend this workflow. My rationale is here [1].
Fair warning I haven't tried to get any OS other than NixOS installed. Not sure how usable Ubuntu ARM or others are.
[0]: https://github.com/mitchellh/nixos-config [1]: https://news.ycombinator.com/item?id=31101605
Before, there were a multitude of reasons not to develop in a VM: Poor support for accelerated instructions on laptops; Slow CPUs; limited RAM; slow file-sharing between the host and guest.
The M1 architecture solves most of the issues.
Modern laptops almost universally support accelerated instructions now. This means less overhead, so doing everything entirely in the VM is worth it now. So no more dealing with slow file-sharing.
The speed of the M1 also means you're not limited compared to your desktop. Depending on the benchmark (especially any benchmark relying on CPU cache size), it may be faster on the M1 air than on a 5950X. Even in workloads where the laptop is slower, it is now fast enough.
Running docker containers in a VM on a 16GB *non-M1* machine is untenable. The M1's RAM is not only higher bandwidth and lower latency, but the compression and caching has improved so much that you can fit much more in that same 16GB.
In use-cases where you need more than 16GB, the M1's NVMe disk is so low latency that swap usage is indistinguishable in performance from RAM usage. So the laptop has no memory limit, for practical purposes (though the wear on the disk is increased in this case).
In addition, ARM architectures were a pain to deal with before, so most people emulated x86_64 and assume that you'd still have to do that on the M1. Nowadays, there is no reason not to run an ARM Linux in the VM. Most programs run just fine, and the remaining holdouts are a few Docker containers that haven't been updated. But even those aren't a problem because recent improvements to Docker greatly simplify running x86_64 containers under QEMU.
Combine all of this with the Mac app ecosystem (which has its problems, but is generally OK to use, especially if your other devices come from Apple), improved battery, the return of the good keyboard, and greatly lowered TDP, there really isn't a choice to make anymore.
The remaining reasons not to use it are basically as follows:
1) Compatibility with external devices, or work on embedded controllers
2) Anything requiring significant GPU compute (ML, etc.). But this would likely be done on a desktop rather than a laptop, which wasn't the scope of the question.
3) Disk capacity requirements (though external NVMe over thunderbolt mostly solves this)
4) Extremely multi-threaded work (video editing, etc.) where a desktop CPU outperforms the M1's multi-thread score.
Less pointless now?
The only remaining limitation are missing some ARM docker containers (which is slowly being solved) and the machines not being suitable for ML (in which case you need a desktop or to rent server time on the cloud).
See: https://github.com/mitchellh/nixos-config
https://www.youtube.com/watch?v=ubDMLoWz76U
Only real limitations are lack of ML because no server/desktop-grade GPU and some missing ARM-based docker containers. But the latter is slowly being resolved and the former isn't gonna happen on a laptop anyways.
There are other forms of moderation that might be acceptable to people who are otherwise free speech absolutists. Crowd-sourced block lists (i.e. subscribe to a list of accounts marked by other users as spam), with the option to introduce your own exclusions to the list.
Alternatively, a web-of-trust model where you only see tweets & replies from people you follow. Or maybe the people you follow + the people they follow. Or maybe configure it on a per-person basis, if you trust person A's followee list more than person B's.
There are a ton of options. The point is that users don't currently have a choice, and have to deal with Twitter's policies with no opt-out or whitelisting.
It may also reduce chilling effects on good actors. Some speech may be worth sharing but may not currently be shared because of those effects.
Whereas if you start with the popular platform and progressively remove moderation, you end up with different effects, because you still have the core, non-bad-actor population. That is, if your signal-to-noise ratio goes down, but the absolute amount of interaction with your platform increases, it may still be worth it.
You can still get targeted for a direct attack but much less likely to end up caught in a dragnet approach.
The GP is saying that once we have AGI, then "AGI is going to make the human race irrelevant" outweighs "AGI makes software devs irrelevant".
I’ve actively been encouraging friends and family to try it and my experience is that motion sickness hits about 18/20 people within 30 minutes of play, depending on the game.
However I’ve noticed that my friends who have played a lot of computer games (in particular fast paced FPS) tend to fare better, and also that the sickness goes away with practice. I used to get it too but now I can beatsaber for literal hours without discomfort.
The headset does make a difference, (my friend’s Vive was particularly bad), but it’s not as great as you suggest. Time and practice are far more important.
More general than just sharing music videos though.
Also, I was under the impression that there are two stages for plant growth: vegetation and fruiting. The two stages have different requirements for nutrients:
- high nitrogen, mid phosphorus, low potassium; and - low nitrogen, mid-high phosphorus, super high potassium
respectively. Do you use the same mixture for both stages?