I’m not a core Gentoo dev, but this is my understanding of what the stability indicators mean, haivng used Gentoo for about a year now.
Sometimes when we’re talking, we want ephemerality. Messages that do not last. Messages that cannot be read after some period of time. There are many reasons for this, and I’m not going to explain them, because I’d rather spend energy on how it can or can’t be achieved.
Haskell has a package database called Hackage. It has a search feature, but it is hard to find things with the search feature. What is bad about it? What are work arounds?
this is a lua script that generates a nodejs cache from a
package-lock.json. why is this useful? well you can generate a cache without this by deleting
node_modules, and then running
npm install --no-save --cache path/to/some/dir. It will cache all the downloads to the directory you gave it. but, it won’t cache anything it doesn’t download. This means if you install
esbuild for example it will only cache the binary executable for your CPU architecture and not other ones.
Simple thing, writing so we can find it again. So first install FreeCAD, easiest with the appimage or flatpak probably. Then open the step file with
File > Open or
File > Import. You’re on a screen like this:
I’m not sure if something changed with the way Nix’s rust build system works in 23.05, but I’m pretty sure something did because this project didn’t suddenly switch to git dependencies since I last built it with git; it was already using them. Anyways whether it’s new or not, you need to specify a hash for each of the git dependencies which works but is annoying to actually do. Here’s how.
So we got ahold of one of these used from someone who found it didn’t do what they needed it to. New, these things are like 1200 euros. We got one for $420 (lmao). though we had to buy a different keycap set to get key legends (prev owner had blank caps), and we had to replace the battery boards with a newer version since this was like one of the first Reform versions made and the battery boards had a problem. the thing is that if you look purely at the CPU performance and ram, and you compare that to the price, this thing is currently really bad value. maybe that changes when they finish designing the RK3588 module but right now that’s how it is. but it’s increasingly clear that the value is there now, it’s just not in compute, it’s everything else.
Alright the premise of this one is way simpler than how we got there. We’ve got a raspberry pi 2, and we wanted to set it up to do some system monitoring. Pretty simple stuff ultimately: it’s got an FTDI serial adapter and an ST-Link both plugged in over USB to monitor a long computer that we’re doing work on right now. It’s also got an ethernet connection to that computer for netbooting, and then it’s bridging that connection to the rest of our network over a second ethernet port. We could get most of the way to what we wanted with Alpine Linux or even raspbian, but we’re running humility to do the ST-Link side of things, and there’s no way in hell I’m waiting around for that to compile an a raspi2. So, cross compile right? Yeah, but cross compiling sucks. Unless NixOS can save us? Turns out it can.
So you’re using helix, you’re working on a rust crate, and you need to turn a feature flag on. Here’s how:
Linux won’t sleep on this motherboard out of the box. I have a rev1.1 motherboard running BIOS version F17b. No idea if this applies to rev1.2. There’s a workaround you can do which is to disable PCIe wakeup on GPP0 (GPP bridge to the m.2 NVMe drives):
echo GPP0 | sudo tee /proc/acpi/wakeup. To make this persistent you need to run this command at boot. I do not know why it is like this. systemd/openrc methods to run this at boot:
It works on illumos. It supports rust-analyzer out of the box. I like the controls. I like the color themes. I don’t need to install or configure plugins.
You may not know this, but you can run your own sync server for Firefox Sync, which lets you keep all your sync’d data entirely on your own servers. The github:mozilla-services/syncserver has been what you use to do this for awhile now, but it’s written in Python 2, which is becoming increasingly non-existent on modern Linux distributions since Python 2 is end-of-life. The replacement is github:mozilla-services/syncstorage-rs, a new rust implementation. I had some trouble just following the docs, but I did some code diving to find the missing details. Here’s what I got working on my machine.
This warning serves no purpose on slow computers where like half of modern web-apps trigger it (thanks modern web-apps). To disable it, go into
about:config and set
dom.ipc.reportProcessHangs to false.
A strategy so simple that a friend described it to me in a few sentences, off hand, not intending to provide me instruction. and I went and did it, and it worked anyway.
Due to Circumstances, I want to boot a NixOS live ISO in such a way that the storage medium can be removed after boot-up. This is at a technical level rather simple. NixOS live images store the Nix store in a SquashFS, and everything else is already in RAM via tmpfs anyway. So in theory all we need to do is copy the SquashFS to ram before it gets mounted. But that does raise the question: how is the SquashFS mounted in the first place? And how can we change that? If you were a reasonable person you would read nixos.wiki/wiki/Bootloader, and you would find your answer: pass
boot.kernelParams. I am not reasonable, and figured it out from the source code, which is what the remainder of this post is about.
I rebased the 4.4 branch of jernejsk/FFmpeg on ffmpeg 4.4.3. You can find that at faithanalog/FFmpeg-v4l2. This lets you use hardware accelerated video decoding on anything that uses v4l2-requests (hantro, rkvdec, etc.). Tested on my Quartz64. You can also download a .patch file that applies cleanly to upstream 4.4.3: v4l2-4.4.3.patch. If you’re on gentoo, drop this in
/etc/portage/patches/media-video/ffmpeg-4.4.3/. Tested on my Quartz64 and nowhere else. You also need to build with
--enable-v4l2-request --enable-libudev. On gentoo, use
EXTRA_FFMPEG_CONF='--enable-v4l2-request --enable-libudev' emerge ffmpeg and consider putting this in /etc/portage/env so you don’t forget later.
You’re writing lua, you want to serialize and deserialize data, and you want to pick the best format/library pairing for the job. What’s good? I’ve been doing some testing to find out. Here’s the short version: If you want the fastest option and you can choose the format, use lua-cbor if you need it to be pure lua, or use lua-protobuf if you’re cool with a C library. If you need JSON, use either lunajson for pure lua, or lua-cjson for a faster C implementation. And now, the details.
There’s this website online that’s a bit notorious for being awful, and also for being everywhere: fandom dot com. Fandom hosts a lot of wikis, some of which have existed for over a decade now. They used to be known as wikkia and provided the quite-useful service of a hosted MediaWiki instance. That’s still what they do actually, but over time they’ve become more and more malignant. I don’t know the full story, what happened with management, whatever, but these days when you go on a Fandom page you’re bombarded with ads for media you don’t care about, weird trivia quizzes, obnoxious animations, and all of this slows your browser down and gets in the way of the page you were actually trying to read. BreezeWiki is a proxy that fixes that, and you can even run your own! You can point the getindie browser extension at your instance or another person’s instance and it’ll turn that pit of despair into a nice smooth browsing experience, and recommend alternative independently hosted wikis if they exist. If that’s all you want to do, go download that extensions, you’re free. But if you want to run your own, that’s what the rest of this post is for.
I want to cross compile to illumos from linux, for reasons I’ll hopefully get to write about in the future. This is a pretty tricky endeavor. Let’s talk about why.
We’ve been passively experimenting with the mold linker for the past six months or so. We’ve got a Quartz64 that hasn’t needed to do much of anything, and because it’s only got 4 efficiency cores, the linker runs long enough that we can actually watch it and see how it’s doing. We’re not really sure if it’s been worth using, and haven’t done any scientific comparisons on it. That said, here’s how we have it set up.
This is not new information but I’ve been having an increasingly difficult time finding the exact options to use in the library of babel that is the modern search engine. So here we are.
I think it’s only fair to call me an X apologist. I get incredibly frustrated when people talk about dropping support for X11. I fight back against the notion that some day X11 will be dead and unmaintained, a curiosity of a time before. I’ve spoken to people in my circles at-length about the accessibility tools that Wayland simply hasn’t been capable of supporting that X11 has. A lot of times, I’ve ended this conversation with “Maybe 5 years from now it’ll be good”. Well it’s 5 years in since I first said those words, and you know what, I’m actually pleasantly surprised.
I read the manual, and I’m putting it here so I don’t forget. As mentioned in some previous posts, I like to run web-apps in chrome with the
--app= flag, rather than use the electron version. For stuff like Discord this largely makes it act like the electron version- the website gets its own dedicated window, clicking links opens stuff in a different window, there’s no browser UI taking up space. The main differences are I don’t have to bother keeping an app updated, and I can apply custom CSS. Anyway, recently I’ve been trying out Wayland with Sway, and it seems that when you launch chrome with
--app=, it inhibits your compositor’s keyboard shortcuts so it can have them all to itself.
Hey! A friend of mine, Cadence, wrote a great blog post about how to start an unencrypted direct message with someone else on Matrix using Element or a fish script. That post is over at https://cadence.moe/blog/2022-07-29-how-to-start-an-unencrypted-chat-on-matrix-element. I’ve also iframe’d it here! This reblog thing is a new thing I’m trying, and I don’t intend to make it a majority part of the feed, but I think it’s fun. Let me know what you think!
Decisions are our keys to the ethereal freedom, but they are also our shackles to the earth. I’ve been thinking a lot about what makes a system pleasant for me to use, particularly as a workstation. I’ve become disillusioned with a lot of Linux distributions as of late, not for technical reasons, but just because many of them feel cause me to feel depressed and dejected when I work with them. One of the primary factors I’ve identified is how they reckon with choice. What do they allow me to choose? What do they force me to choose? This balance is why I use Puppy Linux, despite everything, and why I’ve gone from being an Arch Linux zealot to avoiding it at all costs.
I am a notorious lover of small computers. At the start of the year I wrote about my darling little Vaio VGN-P that I use all the time for communications, writing, and even dev work. But these things are long out of manufacture and difficult to repair. In current year you can get some compelling options from GPD, but their keyboards are pretty bad, so they’re out of the question for me. So, when I heard about the MNT Pocket Reform, I was pretty fucking interested. My first impressions are pretty good, but there’s some problems that could end up being deal breakers.
If there’s one thing that is guaranteed to piss me off in the current year, it’s a social media tool that doesn’t let me disable GIF animations. Personal websites- yeah, whatever, it’s your website. But when social media lets people blast animations into my feed, I’m just not ok with that. Today’s offender is cohost, some hip new website for Posting that some of my friends are using. The GIFs are fucking everywhere and I want them to stop. Websites shouldn’t take all the blame here. If we weren’t living in a hell disguised as middle-earth, browsers would have a setting to disable GIF animations at the browser level. But we don’t, so websites have to do all sorts of bullshit if they actually want to support disabling GIF animations, especially if they want play-on-hover support. Anyways, today cohost is in my line of fire and I decided to do something about it. Here’s my janky userscript that replaces gifs with canvases, with a snapshot of the gif drawn on.
If you’re in need of a backup solution for your *nix machines, BorgBackup is a great tool for it. Borg features encryption, deduplication, append-only data access for ransomware resiliency, and data compression. I’ve been using it for five or six years now and I’ve developed a strategy for deploying borg that I’ll share with you.
Welcome back to me making bad decisions with Oxide software. Today we’ll have a look at Crucible, a networked storage service. Now, “network storage” can mean a lot of things, from low level block devices to high level bucket stores. Crucible sits at the low level end of the spectrum, and is intended for stuff like block devices for virtual machine. I’m going to tell you what I’ve learned from digging through the crucible git repository and talking to Josh Clulow (seriously, thanks for answering all my 2AM questions). Then for dessert I’m going to turn a Raspberry Pi into a WiFi USB drive backed by a Crucible datastore on my OpenIndiana box, complete with block-level encryption and data replication.
The early 2010s was when I first got into music in a big way. Early on, I just had some files in the first music player app I thought looked cool, but as my library grew my methods for listening to music got more and more convoluted, culminating in a DIY cloud streaming setup. I wanna write about it, for my own memory and amusement. Maybe you’ll get a kick out of it too!
I’ve got this rock64, which is an aarch64 board comparable to a Raspberry Pi 3 B+ with 4 gigs of ram. For years I’ve wanted to put a distribution on here that doesn’t have a premade image available, mainly because out of all the options on that page I don’t actually like any of them. Well, except NetBSD, but NetBSD doesn’t have GPU drivers for it. Problem is, everything I do want to use provides rootfs tarballs and tells you to figure it out. To do that I’ve got to get a Linux kernel, track down the device trees so it knows what hardware it has, and then wrangle u-boot into actually booting the whole thing. I figured that would be the hard part; little did I know the depths that Single Board Computer Hell would reach.
It was a calm day on the puppy-linux thinkpad. The CPU was cool, the RAM was operating at double data rate, and a gentle breeze flowed through the chassis as the fan whirred away. A girl wanted to log onto Discord to chat with her friends, but much to her dismay, Discord needed a package update! No matter, such things happen from time to time, but she’d need to uninstall the old version first. She threw on her systems-witch hat and set to work.
WebAssembly is a specification for a portable binary execution format, which has grown far beyond its original intent of simply providing an alternative runtime for running code in web browsers. Notably, it has a segmented memory model that is unlike the usual flat address space most programs are accustomed to running in. Not that programs don’t usually run within some level of memory segmentation, but it’s usually not something tracked alongside your pointers and is handled a bit lower level than that. WebAssembly also makes complicated memory allocation environments where multiple library may have multiple memory allocators a bit of a bear to get working, and this has been the source of much debate hammering out the standard moving forward. Therefore, WebAssembly tends to be at its utmost smoothest when everything is statically linked, memory regions are known statically, and there’s no dynamic allocation outside these regions at runtime. And here’s where things get interesting, because that’s exactly what you get with Hubris.
In my last Oxide-related post I got Oxide’s Propolis software running and said I might try and get their sled agent up and running next. Anyways that didn’t happen. Instead I ended up reading datasheets, writing rust codegen, spending 16 gigs of ram for an hour to build docs for a crate that’s just a glorified bundle of pointers, dreaming about serial data transfer, and uploading code to my smart watch over the slowest debug link I’ve ever had the displeasure of using. *Record Scratch* You’re probably wondering how I got in this situation. Well, it all started when I learned the nRF52832 microcontroller has a memory protection unit.
I’ve got something special in the works for my next Oxide-related post, but while I work on that I want to revisit an old project of mine, uninspiringly named calccomp. The README claims it’s a C compiler but that’s a lie; I never got very far on the C part of the project. What it does have is a custom Z80 assembler and a compiler for my own dialect of FORTH, with a few neat features like the ability to write an infinitely recursive “word” (the FORTH terminology for a subroutine/function) without stack overflows. I’m leaving the project in its unorganized and disheveled state, but it deserves some proper representation.
So Oxide is making some cool stuff huh? Big metal boxes with lots of computer in them. Servers as they should be! Too bad I can’t afford to buy one for myself… but wait, they’re open-sourcing the software they’re writing to do it. Mom said we can have Oxide at Home!
Recently we got our hands on some nice DDR3 era hardware, which we’ll use eventually for NAS purposes. It’s got 96 gigs of ECC RAM, two Xeons, the works. For fun we’ve decided to run OpenIndiana on it, an illumos distribution. OpenIndiana has a package manager called the Image Package System (IPS), and the default repositories have basically everything we’d need, but for another layer of excitement we put pkgsrc on here too. pkgsrc is a repository of package build scripts, most of which work on NetBSD, Solaris, illumos, Linux, macOS, and more! Joyent actually provides a binary distribution of pkgsrc for illumos, but on our everlasting journey for increasingly esoteric layers of fun we’re building pkgsrc from source. Don’t worry, it was easier than you think.
``` Regret License Version 1.0, February 2022
I’m currently working on porting Tailscale to NetBSD. Actually, I already have the core functionality working (see screenshot below). I don’t have a full idea of what the rest of the port will look like, but there’s plenty of additional features and loose ends that I need to chase down until this moves from proof of concept to something upstreamable. This also relies on adding a NetBSD backend into wireguard-go, which I actually have no idea how to upstream, but I’ll burn that bridge when I get to it. Anyway, I’m gonna talk about what I’ve done so far and what needs to come next.
A friend of ours has been struggling with RSI. As part of their plans to address this, they decided to create a secondary Discord account to use on their phone, for direct messaging purposes. That way, they could still talk to people from their phone, but wouldn’t be tempted to participate in active discussions in group channels. As part of the signup process, Discord forced them to provide a phone number for account verification. They provided the same phone number they used for their primary Discord account, and in response, Discord locked both accounts, cutting them off from a huge part of their social circle. Discord’s support was unable to unlock the account or provide any information on when it might be unlocked.
We’ve been using a Sony Vaio VGN-P588E for the past few months as our primary personal laptop. This thing’s great; it’s got a small but not uncomfortable keyboard. It’s got a trackpoint, which we absolutely need to keep our hands healthy. Crucially, it’s only 1.5 pounds. We’re disabled in a way that means we’ve got to care about every bit of weight we add to our bag when we leave home, so that’s a big deal! One catch: the Intel Atom inside hits a peak speed of 1.33GHz, with a normal speed of 800MHz under most thermal conditions. Oh yeah and there’s only 2GB of DDR2, GPU drivers don’t work in Linux, and it’s a 32 bit processor too did I say one catch I meant four. Let’s talk about life in the slow lane.
Here’s a small script to reflect a git repo from some source like GitHub to some destination like an internal gitea mirror. That’s my usecase. You could also use this to go the other direction, or whatever you like.
About 4 months ago we picked up the “wowstick” electric screwdriver. It’s a lightweight handheld screwdriver with a rechargeable lithium-ion battery. It’s got some limitations worth knowing about, but as someone prone to being injured by manual screwdrivers it has made a huge difference to my ability to work on hardware projects.
Let me give you a view into the hellworld of “microsuites”. This shit is becoming more and more prevalent and it’s so incredibly cursed. Picture this: You come home to your apartment building. You walk up five flights of stairs to the top-floor of your building with no elevator. On the way you pass the communal kitchen on the second floor. You walk in your front door. You’ve got like 200 square feet of living space: there’s a bathroom with a shower, a sink, a mini-fridge, a microwave. The place came with internet, you didn’t have to pay for that. You’ve got a ladder up to a loft with your pre-furnished full-mattress bed. Before bed it’s time to cook up a nice pot of- wait, aren’t we missing something?
This is the first of what I hope will be a series of practical guides for using Puppy Linux. I’d also like to contribute these to the wiki later but I don’t want to learn how to do that right now. Anyway, this is a short post explaining some things about the ROX File Manager, the default file manager in Puppy. Everything here is also in the full documentation, but digging into that can be daunting when you’re starting out.
Nix RFC 0098 was submitted to the Nix community recently. In its own words at the time of this post, it aims to “establish an official community team to model social norms, mediate interpersonal problems, and make moderation decisions”.
I use Puppy Linux on my laptop. Everyone I mention this to is like “Oh yeah Puppy, I used that on a flash drive that one time at school” or something to that extent. That’s kinda where I was when I tried it too; I didn’t want to buy a boot drive for my thinkpad when I had a slim USB stick I could just plug in with 128 gigs of storage, and I had heard puppy was fast for that. I wasn’t wrong either, this thing runs way better than it has any right to given the speed of this storage device. But what’s even cooler is how easy it is to remix a puppy linux distribution into your own custom puppy that you can share with others.
Social ranking numbers are poison to my mind. Likes, views, retweets, boosts, all these things are to me a social slot machine. Put words out, see which words get the numbers highest, chase that dopamine one more time.
Something I’ve been quite enamored with recently is ExpressCard. It’s an older standard that’s conceptually similar to Thunderbolt; basically, it’s a slot in the laptop that can provide a USB 2.0, USB 3.0, or PCI Express interface.
There’s a keyboard layout I’ve been using for the past 8 or 9 months. It’s called the workgirl layout. It may look familiar to some of you:
So you have a lua file, and you want to be able to run it from the command line like
./your_script.lua. In languages like python or ruby you would accomplish this by adding
#!/usr/bin/env ruby or
#!/usr/bin/env python as the first line of the file. The
#! magic pattern, known as a shebang (sheh-bang) or hashbang, tells linux to use a specific command to execute the file. You can do this in Lua too, but it’s not the most portable option.
TL;DR: Input sequencing and automation tools such as autohotkey scripts, hardware macros, auto-clickers, and turbo buttons are important accessibility tools that allow people with disabilities to play games they’d otherwise be unable to play. These tools are often banned in multiplayer titles, particularly MMORPGs, in the name of fairness and bot prevention. I argue that these tools should be allowed, or even implemented within the game itself. With the recognition that a line has to be drawn somewhere, I suggest that a tool should be classified as a bot only if it automatically makes meaningful decisions in response to stimuli provided directly by the game, creating a feedback loop that does not involve the player. Further, I suggest that in the games that can’t allow external tools fairly, first-party accessibility features can still make the game playable for more people.
In this post I am going to talk about programming with speech recognition software, also known as voice coding. Voice coding as a concept is nothing new, though you may not have heard of it. Here are some talks you can check out if you want to see what this actually looks like in practice:
Recently I wanted to set up a periodic job to mirror some of my personal youtube playlists. There’s plenty of reasons one might want to do this. For me it’s simple: one copy is none copy, and two copies is one copy, so I want a second copy of youtube videos I care about stored locally. This protects against videos getting removed, copyright stuck, youtube shutting down, or anything else that might make the youtube video otherwise unavailable.
It turns out that transmitting and receiving SSTV signals is pretty easy, using just a raspberry pi as a transmitter and an RTL-SDR as a receiver. There are a few programs which you’ll need to install before you begin:
TI-BASIC is the unofficial name for the programming language included on the stock operating systems of the TI-83 and TI-84 Plus series of calculators. This includes a large set of calculators, the most popular these days being the 96x64 monochrome TI-84+SE, the 320x240 16 bit color TI-84+ Color SE (referred to as the “CSE”), and the newly released TI-84+CE which features a LCD which is significantly faster to access than the CSE and a processor upgrade from a z80 to an ez80.
I was watching
[REDACTED] write what was essentially a re-implementation of Doom in
Dart recently, and it inspired me to port Prelude of the Chambered (PotC) to
One method for displaying numbers larger than 16 bits is to convert it to Binary Coded Decimal (BCD) first, and display the result. BCD works by using four bits to store each decimal (base 10) digit of a number. The following code can convert a number to BCD, and display it. It’s currently written to convert a 24 bit number to a 10 digit BCD number, but can be modified to support anything really. It is memory ineffecient, because it uses one byte for each digit rather than storing two digits per byte. This is useful though because it makes the display routine simpler.
One of the fastest practical ways to write arbitrary pixels (no 1-color rectangles) to the LCD is with an OTIR loop copying pixel data directly from memory. That being said, I was wondering how many pixels you could theoretically update per frame. As mentioned, this is theoretical. This does not take into account the overhead of adjusting the LCD window, or any of the other logic you may have. It also assumes that interrupts are disabled.
Half res mode is an LCD mode which results in a halved horizontal resolution. This can also be used for double buffering, because one can write to the left side of the screen while displaying the right side or vice versa.