I got around to building this new keyboard. It's essentially the lightcycle version of the Dactyl keyboard . The few differences are that the space and port for the board is bigger to accommodate a nice!nano board with pins. The keyboard is wireless thanks to the nice!nano. The board has a USB-C connector, but I added these magnetic charging and data cables to make charging and connecting…
I don't install development tools globally. I don't have node added to my PATH in my ~/.zshrc file, and running cargo outside a project folder returns "command not found." I wipe my computer on every reboot. With the exception of four folders ( /boot , /nix , /home , and /persist ), everything gets deleted . And it has worked out great. Instead of installing…
I've been on a hunt to find a simple and declarative way to define VMs. I wanted something like NixOS Containers , but with a stronger security guarantee. I wanted to be able to use a Nix expression to define what the VM should look like, then reference that on my Server's expression and have it all work automatically. I didn't want to manually run any commands. The hunt is over, I…
I've made a backup system I can be proud of, and I'd like to share it with you today. It follows a philosophy I've been fleshing out called The Functional Infra . Concretely it aims to: Be pure. An output should only be a function of its inputs. Be declarative and reproducible. A by product of being pure. Support rollbacks. Also a by product of being pure. Surface actionable errors.…
Take a look at this picture: That's a photo of Smalltalk 76 running the prototypical desktop UI. It's taken for granted that this photo will be viewable for the indefinite future (or as long as we keep a PNG viewer around). But when we think about code, maybe the very same Smalltalk code we took this photo of, it's assumed that eventually that code will stop running. It'll stop…
Multi Stage builds are great for minimizing the size of your container. The general idea is you have a stage as your builder and another stage as your product. This allows you to have a full development and build container while still having a lean production container. The production container only carries its runtime dependencies. FROM golang:1.7.3 WORKDIR…
The only difference between being a grown up and being a kid, in my experience, is as a grown up, you have much fewer people who are willing to play the game telephone with you. Luckily for me, I have access to a computer, a C compiler, and a Rust compiler. Let me show you how I played telephone with Rust & C. tl;dr: Rust can't re-export from a linked C library (unless you rename) when…
When I ran into Fastly's Terrarium , the appeal of Webassembly (wasm) finally clicked for me. We could have lightweight sandboxes and bring in my own language and libraries without the overhead of a full OS VM or Docker . That's great for the serverless provider, but it's also great for the end user. Less overhead means faster startup time and less total cost. How much faster? On my…
Response to Why React? Some quick thoughts I had after reading the Why React? gist. Disclaimer: I want to be critical with React. I don't disagree that it has done some amazing things "Compiled output results in smaller apps" E.g. Svelte apps start smaller but the compiler output is 3-4x larger per component than the equivalent VDOM approach. This may be true currently, but that doesn't…
Active Projects (with updates) React Causal Profiler https://www.youtube.com/watch?v=r-TLSBdHe1A&t=11s fastly labs terrarium on KBFS Push wasm code, have it run on distributed servers for you (done)[https://marcopolo.io/wasm] Android Wired - A Rust UI framework for Android (repo)[https://github.com/MarcoPolo/android-wired/] An attempt at…
The Recurse Center is this magical place where hours fly by, and you can be as distracted or as focused as you choose to be. It's composed of two nice floors of a building in downtown Brooklyn. They provide a space where you can progress on your own programming specific goals at your own self direction. Some of my best friends are RCers. All of them really enjoyed their time at RC, and would…
Blogging I started this blog like many other folks, on GitHub Pages. It was great at the time. You can have a source repo that compiles to a blog. Neat! Over time though I started really feeling the pain points with it. When I wanted to write a quick post about something I'd often spend hours just trying to get the right Ruby environment set up so I can see my blog locally. When I got an…
Introduction There are 3 parts that let JS talk to Go: The C++ binding Installing the binding Calling Go Not all the code is shown, check out the source code for specifics. Part 1 - The C++ Binding The binding is the C++ glue code that will hook up your Go code to the JS runtime. The binding itself is composed of two main parts. Part 1.1 - The C++ Binding The binding is a c++ class that implements…
No One At The Wheel: Driverless Cars and the road of the Future I picked this book up after listening to Schwartz talk on Fresh Air . Schwartz is a traffic engineer, who worked at the chief traffic engineer for NYC. I was interested in this book because it adds a healthy dose of skepticism to all the hype I've heard about self-driving cars. I expected him to say "The future will be perfect,…
I've finished my second read through of The Craftsman . It's an argument that craftsman are more capable than society gives than credit for. The notion of animal laborens , that man is simply a thoughtless animal, is wrong in Sennet's view. He argues that we think deeply when we work with our hands. The woodworker isn't just idly planing away at the wood she's working on.…
Maybe you've heard of React , Om , or Elm , and wondering: what's the deal with functional reactive programming (FRP)? This post will act as primer on FRP using vanilla JS, but the ideas presented here translate pretty easily in any language and UI system. So let's start with an informal, pragmatic definition of FRP: Use streams of data to create the application state (data) And…
Concurrent Programming Javascript by default is single threaded, but web workers introduce OS level threads. Concurrent programming is hard enough (in imperative languages), so the webworker designers decided to circumvent a bunch of concurrency problems by forbidding any shared data between threads. There are better ways of doing this (read immutability ), but we work with what we got. Problems…