2,695 karma · joined February 5, 2016
Dedicated DACs/ADCs will almost always offer better performance than the ones you'd find on a microcontroller or even an ASIC.
There have been a bunch of times where I've asked it to write me a snippet of code, and it cheerfully gave me back something that doesn't work for one reason or another. Hallucinated methods are common. Then I ask it to check its code, and it'll find the error and give me back code with a different error. I'll repeat the process a few times before it eventually gets back to code that resembles its first attempt. Then I'll give up and write it myself.
As an example of a task that it failed to do: I asked it to write me an example Python function that runs a subprocess, prints its stdout transparently (so that I can use it for running interactive applications), but also records the process's stdout so that I can use it later. I wanted something that used non-blocking I/O methods, so that I didn't have to explicitly poll every N milliseconds or something.
Greyhound buses run more-or-less on time. The routes are direct, they're predictable, and they will take you where you want to go. They also don't have a dining car, spacious bathrooms, room to walk around and stretch your legs, etc. If somebody has diarrhea, everybody on that bus is going to know it and smell it.
Amtrak is more comfortable in every way. It's also usually late, and subject to delays because of low rail priority. You can't really count on it for anything other than "it'll leave eventually" and "it'll get there eventually". While on the train, it's really quite pleasant - as long as you don't care about arriving when the schedule said you would.
Something about the “every productive project depends on this one external package” situation really makes me uneasy. And there are language features like async that can’t even really be used without going to crates.io for a bunch of stuff that really ought to be in the stdlib.
- symlink
- hardlink
- shell script wrappers
- executable binary wrappers around libbusyboxFor me, I detect them by checking the exit-code on each command that I run, and also by looking for expected output in response to the commands.
Corrective action is usually a full-stage retry.
Dismissing it as being for olds is short-sighted.
Make is designed to take a bunch of little shell scripts, give each one an arbitrary name (which can be the output files if you want, but doesn't have to be), and run them. Dependencies are run first, if your script has any of them. Files can satisfy dependencies unless you tell Make that they don't.
It's really not different from a shell script with a bunch of functions that you can call by name, except that Make has already provided the scaffolding for you (including dependency-awareness, tree walking, parallel execution, etc)
Make targets can be whatever you want, and don't have to produce files.
Make -n TARGET will list everything that Make thinks it needs to do to achieve TARGET, including anything that has to happen for any expressed dependencies (which can be tasks, and don't have to produce files).
Make recipes are arbitrary shell scripts that can do whatever you want, including changing directory. Make can also include other Makefiles, or call other Makefiles.
At its core, Make is a way to express "snippets of shell scripts, with a dependency graph between them". It can track files as dependency input and output -if you want-, but Make does not care if you don't. Call your targets whatever, and don't have them produce files. Boom, command runner. Make also has a powerful design, with a lot that you can do at parse-time.
And as it turns out, most tasks -do- have some amount of file dependencies. Maybe they need to consume a key file. Maybe they download a tarball. Maybe they produce a logfile that another task uploads. Being able to express as much (or as little) of that dependency graph as I want is a feature, not a bug.
It's not exactly a popular language these days, but it has its niches. It has a small runtime with an event loop and a nice GUI extension. It's stable, easy to embed into other programs, easy to write, supports networking and all kinds of OS operations, and has a large body of libraries and examples out there. Its performance is also pretty reasonable these days.
These days, I think that Lua and Python are more common as extension languages - and that's totally fine. But there will always be room in my toolbox for Tcl.
Pigs especially were a significant urban technological advance, good at turning most kinds of organic matter into usable food. They played a big role in the rise of many civilizations.
If we ate less meat overall, we could absolutely produce it in ways that were environmentally friendly.
So yes: you need those dependencies in a development context, if you're actively modifying your Python requirements. But they don't make their way into your production requirements.txt, and don't need to be installed anywhere other than a short-lived venv.
One-time (or as-needed for manual upgrades):
1. Make a venv with setuptools, wheel, and pip-tools (to get pip-compile) installed.
2. Use venv's pip-compile to generate a fully-pinned piptools-requirements.txt for the venv.
3. Check piptools-requirements.txt into my repo. This is used to get a stable, versioned `pip-compile` for use on my payload requirements.
During normal development: 1. Add high-level dependencies to a `requirements.in` file. Usually unversioned, unless there's a good reason to specify something more exact.
2. On changes to `requirements.in`, make a venv from `piptools-requirements.txt` and its `pip-compile` to solve `requirements.in` into a fully-pinned `requirements.txt`.
3. Check requirements.in and requirements.txt into the repo.
4. Install packages from requirements.txt when making the venv that I need for production.
This approach is very easy to automate, CI/CD friendly, and completely repeatable. It doesn't require any nonstandard tools to deploy (and only needs pip-compile when recompiling requirements.txt). It also makes a clear distinction between "what packages do the developers actually want?" and "what is the fully-versioned set of all dependencies".It's worked great for me over the years, and I'd highly recommend it as a reliable way to use the standard Python package tooling.
1. Non-isolated Bazel target that produces a container image.
2. All other targets are isolated, and build inside of a container created from the new image.This has the following effects:
1. There are unexpressed package/tool dependencies.
2. Across a large organization, Bazel's reproducibility guarantees go out the window.
3. Developers can't just clone the repo and start using Bazel. Instead, they have to pull down some pinned Docker image, or build it themselves and lose reproducibility.
4. This effectively poisons the cache whenever the Docker image is updated or rebuilt. If using a shared remote cache, it can be a major issue.
If an organization isn't big enough to vendor every single tool dependency, shared library, etc (which basically requires building out an OS distribution in Bazel), what's the right way to approach this problem?Their moat is supposedly their ASIL certification, but I see that value shrinking more and more over time for the following reasons:
1. If your product has a software-related failure, customers won't care about all of your certifications. Only the end product.
2. I'm not convinced that the QNX kernel is less buggy than the Linux kernel. Also, most failures don't tend to be kernel related.
What other parts are out there that are similar to this? It would be fun to play with one that has a little more RAM, and maybe a faster clock rate.
You don’t need to know any tmux to use it either (except for how to launch the right mode, which is easy to script).
If you spend a lot of time SSHed to other computers, I would highly recommend trying it out.