In 2013, I wrote a program in Node.js called sshp. This was right
around the time I was investing heavily into learning node, and
honestly having a blast doing it. Node is quick and fun to write, and with
only a couple hundred lines of code, I was able to write
node-sshp is a command line utility that acts as a parallelizer for
It works by taking in a file containing a list of hosts to connect to and
looping over each host firing off an
ssh command in parallel (with a
configurable maximum number of concurrent processes). The tool’s description
sshpmanages multiple ssh processes and handles coalescing the output to the terminal. By default,
sshpwill read a file of newline-separated hostnames or IPs and fork ssh subprocesses for them, redirecting the stdout and stderr streams of the child line-by-line to stdout of
Writing this tool in Node was an obvious choice at the time: the company I was working for was using Node heavily, and this tool was written specifically to be used at my job. Managing multiple concurrent child processes and IO streams also made Node the obvious choice.
Super Mario 64 is one of my all-time favorite games. Last year, the source code for the decompilation project was made available to the public. I won’t go into detail on the decompilation project itself (see this post here for more information), but instead will focus on getting Super Mario 64 compiled on Void Linux.
A couple of dependencies will need to be installed that will be used throughout
the installation process. Note that root privileges are only required in
sudo is used - the rest of the commands can be run as an
sudo xbps-install git sudo xbps-install make sudo xbps-install wget mkdir ~/dev ~/src
For this guide, the sm64 source code will be checked out into
~/dev, and the
required dependencies that are installed manually will be in
~/src, of which
there are 2:
To install this package, I found it easiest to take the
qemu-irix release as a
.deb file from the
n64decomp GitHub organization and extract the deb
In 2018 I created my own DIY Pump It Up Pad Platform With Bars - it was a combination of Precision Dance Pads and a platform with bars I created myself. This setup was… decent at best. I wanted the full arcade experience, and knew that nothing was going to satisfy that except for the real arcade pads.
Luckily for me, my friend Kate added me to a buy/sell/trade Facebook group for arcade rhythm games, and within the first week there was a post for used Pump It Up pads for sale about 8 hours away from my house. I jumped on that opportunity immediately!
In 2016 I built an Overwatch Themed Desk for my bedroom to use with my gaming machine. Recently, I’ve been getting really into streaming on Twitch and I needed more desk space. I want to do more tech related streams, and gaming in general, and need more desk space for multiple computers.
I decided I should build a new longer desk to replace the desk I currently use. I wanted it to be the same height and depth, but this time make it 6 feet long.
COAL, or Cloud-on-a-Laptop, is an
easy way to run and test SmartOS and the Triton
Stack in a self-contained VM meant to be run
on a laptop. The sdc-headnode
repository makes a lot of assumptions when building a COAL image about using
VMWare for virtualization on an OS X laptop. However, with some modifications
it is possible to run COAL on Linux via KVM managed through
virt-manager setup and running on Void Linux, you can follow my guide
KVM Virtualization with virt-manager on Void
Nested Virtualization (optional)
Before getting started with the COAL building process, you can choose to enable
nested virtualization if your hardware supports it. This is required if you
would like to run
bhyve zones on your COAL setup. Note that this setup
assumes an Intel CPU.
You can check if your CPU supports nested virtualization by running:
$ grep ^flags /proc/cpuinfo | grep -c ' vmx ' 8
Running and managing virtual machines on Linux is very easy using the virt-manager GUI program. Under the hood, the virtualization technology takes advantage of KVM (Kernel Virtal Machine) in the Linux kernel. The result of both of these together is fast and efficient hardware virtual machines with a really easy and straightforward GUI to manage them.
For this post, I’ll be using the following tools I’ve talked about in my blog post Using Void Linux as my Daily Driver:
Install the following packages to get started:
sudo vpm i virt-manager libvirt qemu
Start the services that are created by these packages:
sudo ln -s /etc/sv/libvirtd /var/service sudo ln -s /etc/sv/virtlockd /var/service sudo ln -s /etc/sv/virtlogd /var/service
vsv to check the status of the services:
sudo vsv status virt
Running a Bitcoin full node is a great way to ensure the health and integrity of the decentralized Bitcoin network. This blog post is meant to be a guide for compiling, running, and monitoring a Bitcoin full node on a server, and as such won’t delve too much into the specifics as to what the node does, or why it’s important to the network health. If you want to know more check out 6 Reasons To Run a Bitcoin Full Node.
Put simply, running a full node will add to the large number of full nodes running across the world to support the Bitcoin network. The nodes ensure the rules of the protocol and consensus algorithms in place are upheld and enforced, which is what fundamentally allows Bitcoin to work and function the way it should.
Miners create new blocks and submit them to the network for verification - it’s the job of the full nodes to verify these blocks (groups of transactions) and ultimately accept or reject them based on their validity. Every full node will verify the validity of any and all blocks submitted to the network and, for each block, decide if it will be the next new block in the chain or whether it should be thrown out in the case that it is invalid (by either a bug in the mining software or a bad actor trying to undermine the network). Full nodes are the final arbiters when it comes to determining which transactions are valid or invalid.
Provision the VM
I provisioned a fresh SmartOS 16Q4 LTS instance with the following JSON payload:
While using Void Linux on my laptop, I wanted some way to trigger scripts as my user when the machine went to sleep and when it resumed. The main goal of this was to be able to lock my machine using i3lock on suspend.
I currently use xss-lock to register
i3lock to be called whenever
the screensaver is activated with this command (run at session start):
xss-lock -- ~/bin/i3lock-retry -enfi ~/Pictures/lock.png
xss-lock running, I set my machine to lock automatically after 600
seconds (10 minutes) of inactivity with:
xset s 600
And locking my machine can be done manually by activating the screensaver with:
xset s activate
Note: i3lock-retry is a simple wrapper-script that calls
i3lock continuously until it exits successfully (i.e. when the correct
password has been entered). I’ve had some issues with
i3lock crashing in the
past and I just have this wrapper in place because of paranoia over ensuring
my system locks correctly.
I wrote vlogger(8) which works similar, by default it logs to syslog and if
/etc/vloggeris an executable file it will exec into
/etc/vloggerwith the service name as argument.
The script would be something like this:
#!/bin/sh exec svlogd /var/log/$1
The main idea is to make it simple to switch from logging to syslog to svlogd by just creating
/etc/vlogger. Its part of the
runit-voidpackage and services could be shipped with this as default at some point.
/etc/vlogger as an executable with the following contents:
#!/bin/sh logdir=/tmp/sv/log/$1 mkdir -p "$logdir" exec svlogd -tt "$logdir"
Updated my existing log services with:
cd /var/service for f in */log/run; do sudo ln -svf /usr/bin/vlogger "$f"; done
And restarted them with:
sudo sv restart /var/service/*/log
The rest of the post is left here for historical purposes.
I’ve been using Void Linux on my laptop for the last month or
so and it has just been fantastic; using runit to manage services has
been so incredibly easy. I wrote vsv to make the output a little more
colorful and the usage slightly easier, but even just using
sv directly has
just been great.