2024-07-06 I’ve archived this post Looking for the post Racket frustrates me? You can read the original post on The Internet Archive’s Wayback Machine. Why archive this post? It’s been about a year since I published this post and since realized something: I don’t have any skin in the game anymore. My workflow is now 100% Racket free. It no longer matters to me if Racket becomes a whopping success or a sullen failure.| Posts on Winny's Blog
Digital Ocean’s App Platform works fairly well with Racket. To activate this service, create a git repository with a Dockerfile in it. Your app will be ran as a container built from the Dockerfile and hosted by Digital Ocean. It appears this platform handles load balancing and scaling. These are good value prospects when considering hosting on this platform. If you wish to use a custom domain you can also do so, such as was the case with p.| Posts on Winny's Blog
Awhile back I found a stack of audio CDs I wished to digitize. It’s a bit of work to do the following steps quickly and while doing other more cerebral work: Open the disc tray Insert the disc Wait a few seconds for the disc to be detected by the OS Kick off abcde to rip the CD. Repeat ad infinitum. The solution is to streamline the workflow: Open the disc tray (first time only) Insert the disc Wait until abcde is finished and ejects the CD, repeat from step #2.| Posts on Winny's Blog
GitLab has recently locked down the accessibility to free CI/CD minutes. You now need to provide a Credit Card to prove you’re a human. Apparently cryptofriends were using the CI/CD minutes to mine for cryptocurrencies. Huh… if I had lesser ethics I’d probably do the same thing! Kind of brilliant to be honest. Anyway, the end result is if you want users to contribute to your project they need to either provide a CC or better yet, you can set up private GitLab runners.| Posts on Winny's Blog
Figure 1: Behold! Emacs 27! When upgrading to Emacs 27 there were quite a few weird things I had to address. My Emacs is installed via Gentoo Portage. The USE flags I have set (to enable/disable features at build time) essentially configure my Emacs to be like Lucid Emacs builds. Here’s the USE flags: Xaw3d acl alsa athena cairo dbus dynamic-loading gif gmp gui imagemagick inotify jpeg lcms libxml2 png source ssl svg threads tiff toolkit-scroll-bars xft xpm zlib -aqua -games -gconf -gfile -...| Posts on Winny's Blog
A fantastic “feature” of Linux, BSD, and even Windows 10 is you don’t really need to reinstall to migrate an installation to a new computer. A common misunderstanding is if you get a new PC, you must use the new OS install, or install a new copy of your OS. If you’re intending on replacing an existing PC (and disposing of or re-purposing the old one), there is probably no need to reinstall your OS and deal with user data migration.| Posts on Winny's Blog
Note: this is my OWN opinion and not representative of any community entity. This is a summary of what I’ve experienced since the Freenode takeover. (The new Freenode is Libera.chat.) Drama? I prefer to not take sides in online drama, but I feel like I have to err on the side of not-nuking-and-paving IRC channels that have existed for decades. Here’s the summary of what’s happened, from my perspective: Guy with a bunch of money takes over a community operated network.| Posts on Winny's Blog
It’s refresh time! Since January 2019 I’ve been blogging on this website and it’s been a rewarding experience. I originally researched many blogging solutions that involved using Emacs Org mode. I settled with org-static-blog and it worked pretty well for the most part. It gave just enough structure and mechanism to enable me to work on authoring content without dealing with the details of website building. Enter 2021, I have used org-static-blog for a couple years, and detailed some of...| Posts on Winny's Blog
Gather.town is a very cool virtual conference platform. You pick an avatar, can voice chat, video chat, and watch presentations all while standing around in a virtual 2D space. A conference which I attended recently had all the talks pre-recorded and played back at live-time. This worked very well because the presenters would take their time and provide the best possible content. Within the virtual conference space, there was a way to play the videos back through moving your avatar into a spe...| Posts on Winny's Blog
I seem to have a lot of suggestions to share with friends about managing disks on a linux livecd. Here are some of the tips I’d like to share. See the table of contents above for a breakdown of the topics discussed. Some disk related topics are out of scope for this article, as they deserve their own blog post. The topics not covered include partitioning, setting up a boot loader, using LVM2 or ZFS, that sort of thing.| Posts on Winny's Blog
Disclaimer: Dvorak, fancy keyboards, whatever, does not replace good lifestyle habits such as computer breaks, good desk ergonomics, and balancing one’s computer life with gasp real life. Dvorak and fancy keyboards can make your life better, but they cannot completely address RSI problems alone. Since sometime 2013 I have faced pain, numbness, and tightness in my hands due to computer overuse. At first I chose to ignore it, but it got so bad I’d take days if not weeks off from prolonged c...| Posts on Winny's Blog
Sometimes I find myself setting up servers on networks with less than ideal network configuration. Most home internets use dynamic IP addresses, which requires extra work to ensure I know the IP address to use when logging into the network from the internet. Another concern is how unreliable home networking gear can be, especially with users tweaking settings without fully appreciating what they’re doing. As a result, I’ve devised an alternate solution to ensure I can always log into boxe...| Posts on Winny's Blog
For a couple months now, I have noticed that running dmesg -w on my workstation does not appear to print out new kernel messages. In other words dmesg --follow “hangs”. Additionally when running tail -f /var/log/kern.log to monitor new dmesg messages picked up by sysklogd (part of syslogng), the latest messages do not come through until sysklogd periodically “reopens” the /dev/kmsg kernel message buffer. Why is this a problem? This is a problem because I use the dmesg log to monitor i...| Posts on Winny's Blog
During these interesting times, I figure it would be a good idea to describe how I’ve been keeping myself busy, bugs I’ve fixed, and some of the daily tasks/routines that keep my day structured. For context: I moved house on the weekend of March 21st, which is a couple weeks before the Covid-19 fiasco became a front-and-center concern for my geographical region. I am finishing my undergrad in computer science — this is my last semester.| Posts on Winny's Blog
Previously I detailed how I set up blog.winny.tech using GitHub for source code hosting and Caddy’s git plugin for deployment. This works well and I used a similar setup with my homepage. The downside is I host the static web content and I am tied to using Caddy.1 I imagine simpler is better, so I opted to host my static sites — https://winny.tech/ & https://blog.winny.tech/ — with GitLab pages. What’s wrong with Caddy?| Posts on Winny's Blog
About a fortnight ago (Nov 9th) I went to the MSOE x Google Cloud hackathon.1 There was pizza, soda, and Google Cloud gear. Each group was given a Google AIY Computer Vision kit to assemble, and build a proof of concept around. The kit contained a Raspberry Pi Zero W, the Raspberry Pi Camera Add-on, a breakout board to provide simplified pin-outs for a button with an integrated light, an additional LED that mounted next to the camera to indicate if the camera was active, and a piezo buzzer.| Posts on Winny's Blog
I attended the GDG Milwaukee 2019 DevFest last Saturday. This was my second hackathon. Around 6-9 teams participated. We coded for six hours, and I learned a lot about team dynamics. We formed a team of eight participants. We encountered a couple significant challenges. The stack matters Initially we decided to use Python and the Django framework. This turned out to be a grave error, because picking up Django quickly while staying productive is challenging.| Posts on Winny's Blog
I ran into a hang today with only ivy enabled and nothing else configured or installed. The behavior was such that after I typed a hostname with a TLD (such as not.existant.com1), then typed C-x d to visit a directory or C-x C-f to find a file, Emacs would hang. My mouse would turn into a pin-wheel. My only recourse was to send the ‘quit’ command via C-g to cancel the operation.| Posts on Winny's Blog
Awhile back I noticed my personal mnt/ directory, my (empty) personal tmp/ directory, and a few symbolic links disappeared from my home directory. I only noticed because I use unison1 to synchronize my desktop and laptop homedirs. The actual amount of removed directories and symbolic links were staggering, and it costed me five minutes of extra effort to search through the unison UI to ignore files I don’t want to synchronize.| Posts on Winny's Blog
As a heavy user of SSH to manage computers and IRC via command line clients, the most used application on my phone besides the web browser is a SSH client. Previously I have used Prompt and it worked, but barely. My issues with Prompt include crashing on emoji spam that is common in certain IRC channels, very slow terminal rendering to the point that watching the output of compiling a large package will cause Prompt to lag uncontrollably for tens of seconds, and a relatively un-intuitive UI.| Posts on Winny's Blog
Redshift is a screen-tinting program that achieves similar goals to the popular f.lux1 program. I perused through the redshift man-pages and noticed there is no documented way to toggle redshift. Of course one can click the notification area icon when using redshift-gtk or SIGTERM the redshift process, but neither is very user friendly. (The mouse is not user friendly.) After some awkward DuckDuckGo-ing and Googling I found an obvious solution on the redshift homepage2: simply send SIGUSR1 to...| Winny's Blog
Figure 1: Blasting off from planet Racket to other planets. Thanks ChatGPT. It’s been almost two years since I took a public step away from the Racket diaspora. I’m writing this post to air out how my Racket projects have gone since then. I believe, as of now, I have zero Racket codebases to maintain — hooray! I want to show how to handle old codebases. Let’s reaffirm the importance of handing off inactive projects instead of holding on to them.| Winny's Blog
The sky above the port was the color of television, turned to a dead channel. — Opening paragraph from William Gibson’s Neuromancer. So I thought to myself, why not write a screensaver for Emacs? Enter snowcrash.el. It’s not on MELPA or anything, but it does live on GitHub within my Emacs configuration repository. M-x snowcrash RET looks like this: It’s fun to look at or leave running as a screensaver!| Winny's Blog
Figure 1: sudo plus emacs Emacs offers TRAMP as a way to edit files over ssh or as a different user. Combine with sudo-edit for easy superuser edits. VSCode has a feature reminiscent of TRAMP called Remote Development using SSH. At the time, I didn’t know of M-x sudo-edit so I wrote my own implementation. It sucked, didn’t work on chained TRAMP connections (e.g. ssh then edit as root on the remote host).| Winny's Blog
Figure 1: Biked & camped 100 miles (160 km) from Milwaukee to Manitowoc in 36 hours It’s been a tumultuous year. It took a multitude of drafts to complete this short piece. I felt demoralized when authoring this post. Then I reviewed my 2023 in review post and it put my frustration in perspective: Life is pain and joy. It’s an undulation of anguish one day, blissful peace the next.| Winny's Blog
All the browser userscripts that I’ve been using were scattered across a multitude of pastebin links and git repositories. It became a bit of effort to track them down to re-install in Greasemonkey (Firefox) or Tampermonkey (Chrome) with the time expended searching exceeding the time saved using my extensions. No beuno. Enter Browser Bits: a curation of userscripts. (See awesome-userscripts to learn more!) Ultimately, the repository will contain Stylus stylesheet overrides and related hodge...| Winny's Blog
Every December since 2015, Advent of Code publishes a Christmas Advent calendar loaded to the brim with challenging programming quibbles and trials. Advent of code can be solved in any programming environment, from Microsoft Excel to Rust, if you can write it, you can use it. In fact, my 2020 Advent of Code “challenge” (or “theme”) was a different language every day. Nope, I didn’t finish all 25 problems, though it was a heck of a lot of fun to practice Forth, various assembly langu...| Winny's Blog
Previously I introduced the reader to ShellCheck. In this post I detail how I use Flycheck in Emacs and offer an Emacs function to automatically suppress Shellcheck errors at the current line. I’m an avid Emacs user and it follows that I’ve set up editor customization to exude the most from ShellCheck. If you, dear reader, are not an Emacs user, I cannot help you! Please, for the love of shell scripts, ensure ShellCheck works within your preferred text editor, lest you wish to ship edgeca...| Winny's Blog
In this post I hope to convince the reader on the merits of ShellCheck. Stay tuned for more posts about using ShellCheck. On Shellscripting Shell scripting is a of passion of mine. Preferably Bash (here’s a guide). (POSIX sh a.k.a. Bourne shell works too, albeit with more effort thanks to diminished versatility when compared to Bash.) The shell scripting language family has many warts as the languages were designed for both real-time interaction and automation programming.| Winny's Blog
Turns out my NAS is vulnerable to the SSH vulnerability which allows anyone to log into your host with enough time, guaranteed. Dubbed regreSSHion (CVE-2024-6387), it affects a host of different OpenSSH version ranges. If one has OpenSSH 9.8p1 or later, one is totally fine. Unfortunately, the NAS is still on NixOS 23.11. The NAS remains on NixOS, but all my other devices have been migrated off to Debian Testing.| Winny's Blog
Here’s a few notes on CPUID and /proc/cpuinfo. I made a table for quick reference. What is CPUID? On x86 and amd64 CPUs, there is a large swathe of differences in features available to the software. Some CPUs ship with AES encryption support, others ship with virtualization support, almost all ship with a collection of SIMD (single instruction multiple data) instructions. The name of the game is to reduce CPU execution times using specialized instructions.| Winny's Blog
What’s worse than a fire on a boat? A fire aboard an air balloon. Rip my fly.io app. Affected Apps: sillypaste-db A server hosting some of your apps has suffered irreparable hardware damage. Please migrate your Fly Machines to other hosts and restore volumes from any backups. All good things come to an end, including this pastebin project. If I find myself using it again, I may spin up a fresh database if that opportunity presents itself.| Winny's Blog
Figure 1: John from USA - CC-BY-2.0 Watch out, things break, stuff catches fire. Let’s talk about backups. Last post, I stated that I’m going to switch focus away from NixOS commentary. This is still the plan. Today, I am still committed to NixOS thanks to technical debt created - migrations aren’t for free. Until then, enjoy my NixOS posting :). Last fall, I wanted to reformat my laptop’s NixOS deployment from BTRFS (encased within LVM2 itself encased in LUKS) to a ZFS partition plus...| Winny's Blog
Figure 1: The laptop that was having a bad day with NixOS 23.11 More upgrade gotchas. Shucks. If everything goes well, this will be my last NixOS post. Read on to understand my frustration just a little bit more. My main laptop is a Lenovo Ideapad Flex 5 — simple and cheap device. The keyboard stopped working in the early boot after upgrading to 23.11. The impact: I need to a USB keyboard around to unlock the device from a cold boot.| Winny's Blog
Figure 1: Jamian · CC BY 3.0 Deed (link) A frequent quip of the unix-beard is shebangs cannot contain multiple command-line arguments. Let’s break it down and see where this assumption no longer holds true. What is a Shebang? The shebang is the line at the beginning scripts such as Python and Shell scripts that instructs the OS how to execute the script. Looks something like #!/bin/sh or #!| Winny's Blog
Figure 1: Official image for 23.11 Upgrading my workstation to 23.11 wasn’t as simple as I was hoping. Ran into a few issues. Performing the upgrade I’m using a flake, so all I should have to run is: # First edit flake.nix so it points to release-23.11. nix flake update nixos-rebuild boot --flake .# (Then systemctl reboot into the new generation that includes a new kernel.) Issue #1: pinentry package changes I can’t unlock any keys using gpg-agent (hence cannot use GPG keys for accessin...| Winny's Blog
Figure 1: Dietmar Rabich CC BY-SA 4.0 (link) Things that I achieved this year. Exercise. I was going 3 times a week to the gym. Now I’m working out at home about once a week. A no-processed-foods diet. Occasional respite from some health issues. I’m not dieing so that’s pretty cool. Remained self-employed. Even after many project transitions including firing a toxic client. Worked with some new technologies including Love2d, Fennel, Angular 3, Next.| Winny's Blog
Hello, my name is Winny and welcome to my honest review of Sway, a i3wm compatible Wayland compositor. Its primary appeal is a compositor experience that is easy to install, and familiar to i3 users. For my usage, it is one of the few compositors flexible enough to deploy on older hardware. Startup Sway does require a bit of effort and time to get it in a usable state from the stock configuration.| Winny's Blog
I had a need to host image galleries online. I researched the cost structures of a few providers, then settled on AWS S3 storage and AWS Cloudfront CDN. The twist is I have all the cloud configuration managed in Terraform, so it’s easy to recreate the same sort of setup for various projects. Hosting provider cost structure After reviewing the bandwidth limits for a static website with a lot of large images, I came up with the following datapoints.| Winny's Blog
The goal of this post is to demonstrate the usefulness of IPMI even in hobbyist or personal use. Anything that means less touching physical machines to power cycle them, or fix network misconfigurations, can save a lot of time. I had broken my NAS’s networking by adding a bridge and attaching the existing ethernet device to it. I forgot to configure the ethernet device to not try to fetch an IP address (via DHCP), but instead only fetch an IP address on the bridge itself.| Winny's Blog
Zathura]] is a fantastic PDF viewer. It also supports Postscript, DjVu, and Comicbook archive. In particular it supports using mupdf for the backend, so it’s rather fast (unlike poppler, used by evince and friends). Here is a screenshot of Zathura: Figure 1: screenshot of zathura Now that I’ve introduced Zathura. I want to talk about a problem I had recently. I wanted to print a document a couple weeks ago, but found whenever I issued a :print command in Zathura, the program would crash.| Winny's Blog
Most of my workstations & laptops require a passphrase typed in to open the encrypted root filesystem. So my steps to booting are as follows: Power on machine Wait for FDE passphrase prompt Type in FDE passphrase Wait for boot to complete and automatic XFCE session to start Since I need to know when the computer is ready to accept the passphrase, it is important the framebuffer is usable during the early part of the boot.| Winny's Blog
This most recent weekend (November 16th) I attended the Milwaukee Code Camp and was pleased with the content. There was plenty of food, coffee, and give-aways. The Talks I attended five talks: starting an open source project (link) 1, how to manage work life balance as a software developer (link), getting started with Docker and Kubernetes2 (link), introduction to Terraform for cloud infrastructure management (link),| Winny's Blog
On my Gentoo desktops, I use Emacs Daemon via sys-emacs/emacs-daemon1 to ensure an Emacs instance is ready to go and always available from boot. This is done via creating a symbolic link like /etc/init.d/emacs.winston to /etc/init.d/emacs which will start Emacs for the given user. See the package README for more details. A shortcoming of this setup is XDG_RUNTIME_DIR2 is not set, as this is set by my Desktop Session - maybe LightDM or consolekit set this?| Winny's Blog
No. Do not use it please! There are far easier-to-read and easier-to-use styles for C! 1 Indentation Style on Wikipedia ↩︎| Winny's Blog
I’ve been using Nix for a year now. It’s been going fairly well, by the way. Here are some misconceptions I’ve had to overcome to become a more productive Nixer. False: You can’t deploy Nix software to Docker or Kubernetes False. If you can push to a docker registry such as docker.io, you can deploy to Docker or Kubernetes using Nix. You can use dockerTools.buildImage to build a docker image from Nix.| Winny's Blog
I recently moved, and my new abode has an Ubiquiti Amplifi LAN. The rationale is this mesh-based WiFi network eliminates the need to install Ethernet between Wireless Access Points (APs). It works surprisingly well. In this post I document how I extended this network so I could place my networked devices all on the same Ethernet segment, without needing to wire it to the Amplifi base station. The idea is the network should look like this:| Winny's Blog
Source lives here. Play it here. In a joint effort, Aliasing and myself have created a novel top-down action rogue-lite for the 2023 Spring Lisp Game Jam. Aliasing is an experienced game dev so in a way, I was along for the ride. Still, I managed to contribute some game mechanics, features, unit testing, CI/CD that deploys to super-rogue.workinprogress.top on every commit. This was a fun devops exercise for me - Aliasing mentioned to me that I helped keep him on track with the addition of aut...| Winny's Blog
I’ve been operating Sillypaste (source code) - a simple Django pastebin created for dogfooding. In this post I hope to capture some of the painpoints of working with Django, Python, Heroku, and the migration to fly.io. Ever since Heroku sold its soul to SalesForce its been on the decline. Customer service is worse than ever, giving wonderful canned responses to most questions. It used to be free to host Sillypaste on heroku, now is a $17/mo ordeal.| Winny's Blog
Figure 1: Pre-commit running within GitLab CI I’ve been using pre-commit as my tool to set up hooks to run when I commit to Git. It helps me catch gotchas such as fixing line endings, fixing whitespace, refusing to commit on linter errors, and so on. Often, I’ve noticed with working on teams is it’s fairly easy for a new contributor to forget to set up pre-commit on their development machine.| Winny's Blog
Figure 1: your computer on low memory TL;DR: yes. You can throw more swap at most processes and it’ll eventually finish… Eventually. Last year I warranty-ed a Dell XPS 13 with 32 GiB of RAM, all specced out. Sidenote: I wouldn’t recommend the Dell XPS 13, at least in 4K. The laptop gets anywhere from 1-3 hours of real world usage and gets hot as most Macbooks. The Dell XPS 13 4K is not a viable product.| Winny's Blog
Here’s a small outline of how I validate used computers as “usable” and “in working condition”. My hope is these steps help computer users spot “lemons” - machines that shouldn’t be depended on because they don’t work all the time. Basics Before stress testing or examining SMART data, consider the following checklist: Turn it on and ensure you can access the firmware settings/BIOS. F2 and Delete seem like the most common keys.| Winny's Blog
For the Lang Party Summer 2022, I wrote a BASIC interpreter. It took a bit of mental gymnastics and learning on my part. In this post I hope to share some of the experience in implementing this interpreter. For the curious, the code lives on GitHub. Figure 1: A TinyBASIC session in Cool Retro Term Try it out! Want to try it out? Run raco pkg install --auto tinybasic to install it.| Winny's Blog
Recently I have begun migrating my workstation and laptop from Gentoo to NixOS. There are a great deal of tradeoffs between the two operating systems. Before going into the details, consider where I’m coming from and why I moved away from Gentoo below. Why was I running Gentoo on workstations?? This is my heuristic for a good operating system: The Distro must provide facility to modify system packages and maintain their modifications in sync with the upstream distro.| Winny's Blog
You want to use sudo -i or su - to log into root. sudo su anything is superfluous, because you probably should be using sudo -i or sudo -s, which are roughly equivalent, depending if you want to simulate a login (su - or sudo -i) or not (su or sudo -s).1 When to use su -? You want to log into root using the root password. Typically you must be in the wheel group (check your PAM configuration).| Winny's Blog
Criteria After reviewing a list of org-mode1 capable static website generators2, I decided to see if org-static-blog3 could suffice my simple needs. My criteria for choosing an org-mode static site generator was: it must be actively maintained, it must be simple to set up with customizations, and it must work with Emacs 26 and later. This ruled out quite a few right away. I didn’t attempt using org-publish, as it looked like a great deal of configuration to achieve a minimum viable web-page...| Winny's Blog