1,882 karma · joined September 22, 2012
It’s so much nicer for 90% of my terminal usage (long multi-line commands, etc.) And when you do need TUI behavior that 10% of the time, just toggle it off.
The nice thing about container-based systems is that all the existing documentation for configuring a given program continues to apply as expected. Of course the tricky part is figuring out how to compose them together.
I've already decided that my personal line in the sand is when they replace the scenic screensavers on Apple TV with ads, something they're already toeing the line with in the newly added Peanuts screensavers. At that point Apple has lost the plot and I want nothing to do with their products anymore.
- It took me a second to find auto-pause. Maybe some of those things in the settings menu could be more accessible, similar to how Spotify puts shuffle/repeat icons near the play button.
- I would really like the arrow keys to move back and forth between auto-pause points.
- Regarding auto-pause, it seems to clip off a little early, maybe consider extending the duration or adding a little bit of overlap?
- When clicking to define a word, "Define in Context" is a nice feature to have but is maybe a little slow (and possibly expensive on your end?) to have as a default. I think just opening a static dictionary lookup by default would be nice. With Japanese, I am able to work around this with the Yomitan browser extension though.
- I probably wouldn't use the spoken translation feature, but when I tried it, the voice sounded very robotic considering the high standards for AI-generated voices these days. Though I imagine a better voice might be a cost barrier.
Please don't take this as harsh criticism, just some initial impressions. Overall I really like the idea and will likely continue to use it for listening practice.
You can absolutely have two different enum variants from the same source type. It would look something like:
#[derive(Debug, Error)]
pub(crate) enum MyErrorType {
#[error("failed to create staging directory at {}", path.display())]
CreateStagingDirectory{
source: std::io::Error,
path: std::path::PathBuf,
},
#[error("failed to copy files to staging directory")]
CopyFiles{
source: std::io::Error,
}
}
This does mean that you need to manually specify which error variant you are returning rather than just using ?: create_dir(path).map_err(|err| MyErrorType::CreateStagingDirectory {
source: err, path: path.clone()
})?;
but I would argue that that is the entire point of defining a specific error type. If you don't care about the context and only that an io::Error occurred, then just return that directly or use a type-erased error.I think that would have been the single biggest improvement to the Python onboarding experience ever.
list_of_lists.into_iter().fold(Vec::new(),
|mut accumulator, list| {
accumulator.extend(list);
accumulator
}
)If ICANN really chooses to break every GitHub Pages, crates.io, gcr.io, quay.io, etc. URL just to blindly follow a policy, then they will have proven themselves an incompetent arbiter of the domain name system. This feels so unlikely that I'm not worried about it all.