nixos

This introduction assumes you have played with NixOS a bit, you know about content addressability and why it is important, and how Git repositories represent a distributed content addressed storage system. Git and Github is used as the source control for all of NixOS and NixPkgs. Both NixOS and NixPkgs source code is located here: https://github.com/NixOS/nixpkgs. This means every package that is available via Nix is defined in that repository. This includes OS services and general software. Nix, the language interpreter and the package manager tool is however located here: https://github.com/NixOS/nix. Channels…

Configuration divergence is a result of change entropy in an environment that doesn't enforce referential integrity between loosely-coupled state or "state-at-a-distance". Simultaneously this allows the anti-pattern of action at a distance. This process gives us a system that becomes more and more opaque as time continues, and we lose referential transparency on the entire system. The result of course is a repeated cycle of entropic reduction projects (often called "refactoring" or "rewriting") where consultants are hired to clean up technical debt. Occasionally these projects will suffer from the second system effect. With this in mind, the significant difference between data…

Today, the most common way for developers to address a dependency is through the use of semantic versioning. This is where you create project A that depends on B at 1.2.3, where 1 is the major version, 2 is the minor version and 3 is the patch version. Accordingly, the rules of following semantic versioning means: Major versions change when you make incompatible API changes. Minor versions change when you add functionality in a backwards-compatible manner. Patch versions change when you make backwards-compatible bug fixes. Theoretically you should be able to update patch and minor versions of dependencies…

Ever since we read Domen Ko┼żar's thoughts on how Nix and NixOS is a superior configuration management system because it features: Declarative Semantics Stateless Deterministic (pure) Avoids dependency hell Idempotent Atomic/Transactional Reversible or Rollbacks We've been thinking about how to apply the Nix philosophy to live database migrations. (Specifically relational SQL databases.) Our motivation is due to problems faced by current database migration solutions. Most solutions do not feature "desired-state" configuration. Instead the migrations are coded in imperative manner, coding the explicit actions to take in order to migrate schema or data. The migration can fail which means they…