gopher://gopher.someodd.zip:70/1/catalog/tech/programming/ Programming Developer tooling, code and compiler workflows, and formal verification. 2026-04-28T00:00:00Z gopher.someodd.zip gopher://gopher.someodd.zip:70/0/tech/programming/Verifying using Haskell in the Age of AI.md Verifying using Haskell in the Age of AI.md 2026-04-28T00:00:00Z 2026-04-28T00:00:00Z Verifying using Haskell in the Age of AI gopher://gopher.someodd.zip:70/0/tech/programming/formal-verification-and-property-testing-of-an-algorithm.txt Formal verification and property testing of a custom algorithm 2024-11-29T00:00:00Z 2024-11-29T00:00:00Z How to confirm code does what it claims: introduces formal verifica... 1,000 test "cases" from just one actual property test. And this is because, I think, you're dealing with more abstract logic, which Haskell really lends itself to. ## more on the alonzo-church split ]]> gopher://gopher.someodd.zip:70/0/tech/programming/git-multi-user.txt git, GitHub and multiple accounts/profiles 2024-11-28T00:00:00Z 2024-11-28T00:00:00Z Configures git and SSH to cleanly separate multiple GitHub accounts... username_public_key.asc gpg --armor --export-secret-keys somekeyhere > username_private_key.asc ``` Moving on, add the GPG key to GitHub (should be similar in the GitHub interface to adding a new SSH key): ``` gpg --armor --export somekeyhere ``` For these remaining configurations, I think there's a better way to do this, but configure `git` to use the GPG key for a specific repo: ``` git config user.signingkey somekeyhere git config commit.gpgsign true ``` Also, config `git` to use a specific username and email for this repo: ``` git config user.name "full name" git config user.email "you@example.org" ``` You can make signed commits like this: ``` git commit -S -m "Test signed commit" ``` ## Git configuration per domain This is a more maintainable approach to have defaults set per domain we have (matching our `~/.ssh/config` domains, used in repos): Create a `~/.gitconfig-username`: ``` [user] name = Full Name email = user@example.org signingkey = somekeyhere [commit] gpgsign = true ``` Update global git configuration (`~/.gitconfig`): ``` [includeIf "hasconfig:remote.*.url:git@github.com-username:*/**"] path = ~/.gitconfig-username ``` Check the applied settings in a repo that uses the domain `github.com-username`: ``` git config --get user.name git config --get user.email git config --get user.signingkey git config --get commit.gpgsign ``` ]]> gopher://gopher.someodd.zip:70/0/tech/programming/haskell-compiling-windows.hs Haskell Compiling Windows (On Linux) 2024-10-14T00:00:00Z 2024-10-14T00:00:00Z How to cross-compile Haskell binaries for Windows from Linux. Writt... gopher://gopher.someodd.zip:70/0/tech/programming/liquidhaskell-verification-stack.txt Setup Haskell verification with LiquidHaskell and Stack 2024-10-14T00:00:00Z 2024-10-14T00:00:00Z Getting started with LiquidHaskell and Stack for refinement-type ve... gopher://gopher.someodd.zip:70/0/tech/programming/haskell-nix.txt Nix Flake a Haskell Project 2024-03-12T00:00:00Z 2024-03-12T00:00:00Z Notes on getting a Nix flake working for a Haskell project to reduc... =4.7 && <5, ``` And Here's a list where you can tell which version of GHC you may want to use based off your `base` constraints: https://wiki.haskell.org/Base_package This tells me it can use anything from 7.8.1 to (as of now) 9.8.1. Based off of deduction of APIs I kenw I had to set the versions of a few dependencies in my cabal file, basically, too. However, one of the dependencies (`errata`) I had to pin wanted something between `4.12` (GHC 8.6.1) and `4.17` (GHC 9.4.1). I changed my `base` constraints around this in the hopes it'd make things easier. Things to pay attention to in the `flake.nix` generated: * Is the cache being used? * `nixpkgs.url`: this may come in handy: https://lazamar.co.uk/nix-versions/ * `basePackages` I also found out a package I was using is broken in nixpkgs right now, so I just added it myself and removed it from dependencies (a library to convert a number to a roman numeral). Another issue I encountered was I needed a specific version of errata, basically, based off the API. I also searched nixpkgs to see which version holds errata 0.3.0.0 so I could set `nixpkgs.url` basically, luckily the flake made this easy: ``` packages = { errata.source = "0.3.0.0"; # Hackage version override # shower.source = inputs.shower; }; ``` after searching for the right errata version in https://lazamar.co.uk/nix-versions/ -- I found it in nixos-22.11. After doing so I think it was clear that I should use something older and more stable than the nixpkgs `unstable`, so I did this: ``` nixpkgs.url = "github:nixos/nixpkgs/nixos-22.11"; ``` Even so I still have this left over: ``` hspec-golden >=0.1 && <0.2 ``` Which I found strange because of these results: https://lazamar.co.uk/nix-versions/?channel=nixos-22.11&package=hspec-golden So i just made sure to set to the latest version that comes before 0.2: ``` packages = { errata.source = "0.3.0.0"; # Hackage version overrid]]>