looking at the code for my old lisp implementation of chicken egg hole, vs the 32blit-sdk c++ version.
the lisp version is so much nicer. maybe i can make them more similar by using structs and functions instead of classes in the c++ version.
looking at the code for my old lisp implementation of chicken egg hole, vs the 32blit-sdk c++ version.
the lisp version is so much nicer. maybe i can make them more similar by using structs and functions instead of classes in the c++ version.
Last year me and Abe started working on some art together.
Itโs called today.

Each page has a picture made by Abe with Word โ97 in a Windows 98 Virtual Machine, and a looping sound by me.

office '97 logo

old windows logo
I make the sounds with a Nintendo Game Boy, a handheld compact cassette recorder and a teenage engineering op-1.

a game boy with a cat face on the screen

teenage engineering op-1 cow fx. a black cow silhouette with flashing neon pipes
You can view the next sound/picture pair by clicking the picture, eventually youโll loop around.
The most recent one is on the homepage/.
Thereโs an RSS feed you can subscribe to, and you can append .json to any page (including the root!) to get a JSON representation of that page. Feel free to do whatever you want with that. The sounds and pictures are all creative commons share-alike.
Originally it was just a few HTML files, but when it started to take shape I wrote some scrappy JavaScript to generate the pages from a JSON file.
But that meant it was a manual process to put something live, or even preview a pairing.
So then I put together an app to manage the page. It takes uploaded media and puts it in Linode Object Storage (which is like S3 but without giving money to jeff).
There are three concepts. **sounds**, **pictures** and **days**.
The page for sounds shows a grid of every sound that isnโt part of a day.

screenshot of the sounds page, showing three un-dayed sounds.
you can click one to preview it, and you can drag a .flac file onto the window to upload a new one. Itโll get a random name like spooky ocean. (adjectiveish noun).
The pictures page is a grid of all the pictures, paired or not.

screenshot of the pictures page. two used and one unused picture.
This is where you add the alt text, and also where you can select the Make a day of it button.
The make a day of it page is where you can preview how a particular picture will work with each available sound.

the โmake a day of itโ page
When you find something that works, you can give it a name and it will be the new homepage the very next moment.
The days page shows a grid of every day thereโs ever been.

the homepage of today manager showing days
Itโs scary to have delete buttons lying around, so those are hidden behind DANGER MODE, which can only be activated by manually adding ?danger=danger to the URL.
After deleting anything, youโre redirected back to the non-danger page.
ok, thatโs all. thanks.

password entry screen. it's the bad ending from bubble bobble.
โญโญโญโญโญ
=^.^=
Iโm working on a clone of Oliver Wittchowโs nanoloop for the Adafruit PyGamer.
The prototype was written in CircuitPython, which is a lovely language, but it doesnโt (yet) have support for the kinds of audio things I want to do.
It was helpful to use it to lay out the shape of the state object, and the controls and the UI.
The audio was unuseable, so Iโve rewritten it in C++.
Itโs coming along very well.
There are 4 sound channels available for use, using the fab Teensy Audio Library:
The **e**nv**e**lop**e** menu item letโs you change the attack, decay, sustain volume, amplitude and panning of your note block with cute visual indicators of each property.
There is a filter and a delay feature, and each channel can play at full speed, half speed or quarter speed. You can alter the bpm in the second menu.
Itโs a lot of fun.
The plans for the next session (this evening?) are:
**m**od menu item)/2 or /4 speed play twice or once during that time)Future plans are to introduce pattern chaining, pattern-length (per-channel), using square curves for attack and decay and chords (positive integer intervals).
The code is very bad and available here:
https://git.snoot.club/chee/bleepbloopmachine
Itโs already starting to diverge from nanoloop, and I hope it will continue to forge its own identity until it can stand strong as its own independent interesting instrument.
i made a website yesterday
i call it the public dump
if you register as a Copyright Holder, you can create Collections and add Pieces to those Collections
๐ here (was) an example collection
it contains some parts of songs iโve started making but donโt know how to finish. and so theyโve been released to public domain.
you can upload any kind of file, and it will be added to the Collection and displayed with a CC0 license, dedicating it to the public domain.
if itโs a sound or a picture or a video it will be displayed with a little preview. registrations are open.
e-mail me with your legal name (for the dedication mark) and desired username, and iโll send you a password.
I set up snoot.club so i could have a place to throw up quick ideas, and also to provide my friends with places to host their ideas. The goal was that Iโd be able to run a script and very quickly have a new domain with a folder i could put things in that would show on that domain.
The DNS records are set up with a wildcard A and a wildcard AAAA record pointing *.snoot.club to the snoot.club linode. This way the moment a process starts listening on a given name (like chee.party), it is available on the net.
Iโve got a wildcard letsencrypt certificate set up on the site, so any subdomain of snoot.club is covered by the same certificate. Those are a bit of a nightmare to maintain because you have to do deploy two more DNS records every three months, but itโs worth it for the convenience during the other parts of the months.
Iโve thought about automating the 30 minutes it takes me every 3 months, using dig(1) and the linode api but that only ever seems like a great idea during those 30 minutes.
The idea was that a person (letโs call them jimmy) would ask me for an account, iโd run a script (create_snoot jimmy) and that would set up a base configuration for them that would give them a place to put files they wanted to be on their site jimmy.snoot.club.
Once I had the SSL certs and DNS sorted out, I wrote a collection of scrappy bash scripts to try out the idea.
The script generates them a user account on the snoot.club linux server, and puts them into a group called undercommon. It makes a directory for them that contains only their ssh[1] public key (which will let them log in), and a folder called โwebsiteโ.
Thereโs a section in snoot.clubโs sshdconfig[2] file that checks if people are in that group and then disallows them from using any program other than FTP software, and doesnโt let them view any files outside of their directory.
Match Group undercommon
ChrootDirectory /snoots
PermitTTY no
ForceCommand internal-sftp
I wanted people with more advanced needs to be able to do more advanced things, but I didnโt want them to have access the whole system.
After creating the unix account, and the ftp entry point for the snoot, the script also creates a docker container for them. Thatโs a kind of tiny machine of their own, that lives inside the snoot.club machine. The docker container forwards two ports: ssh and web (80). The http server configuration that is built when jimmy is created points jimmy.snoot.club at the whatever the docker container has running on port 80 (the web port).
I provide jimmy with a port for them to use when they are sshing in, (so theyโd do like ssh root@snoot.club -p 33532) and then they ssh not into snoot.club but into the docker container that is jimmy.snoot.club. this way they get to do anything they want without having to have full access to the snoot.club machine!
the default app in the docker contain is a static server pointing at the โwebsiteโ directory, the same one the user can see when they ftp in.
this system works fine until there are more than like 30-40 people. thatโs fine. if it ever got popular it could be rewritten. itโs so easy to lose momentum of your ideas if youโre trying to plan for what if it ever gets bigger. most of them wonโt, and it doesnโt actually matter! build things you want to for you and your friends, and if you ever need to make it better then you can do it then!
while iโm on that subject: we donโt need to all pretend to be brands, we should be doing silly things like having a completely different style sheet on every page and the web is mostly people, not companies. and the companies are also made of people. be people.
over the christmas and new year period i was in a barn at the bottom of a some rich folks garden in putney, and i rewrote the shell scripts in javascript. the bed there was very cosy and i also made a christmas dinner (but i didnโt cook the chicken right and it got scary).
this one works pretty good! the things it does are the same. it offers to download a new snootโs authorized keys from github (thanks jake for this idea), and it prints out coloured messages and has emoji and feels pretty good.
i created a special image for the docker container that contained perl6 rakudo, and started the script with pm2 on boot and would restart the server if there were any changes.
so this worked really well for 6 months! kj built the facepainting and rowan did a throwback and abe built a shop and chee built some stuff. but then I started wanting it to be simpler. some problems had started to occur. hereโs some things that weโd run into:
I started to look into other options. I created another chroot-based system that worked similar to how the ftp thing works but allowed more control. That still felt too heavy.
Reading the node.js documentation i noticed this in the http module docs: server.listen() Starts the HTTP server listening for connections. This method is identical to server.listen() from net.Server.
and in the net.server docs one of the signatures listed is a Unix Domain Socket. now, i love unix domain sockets. i built a window manager in javascript that used a unix domain socket as its main form of management. it was cool. everything was a command. i used it irl as my main window manager for 6 months. the use of sockets was inspired by my favourite window manager wmii which was in turn inspired by the plan9 operating system created at bell labs. the same place that invented unix, lasers and wifi (also transistors and nearly everything else). (though both wmii and plan9 use the 9P protocol, not Unix Domain Sockets).
Anyway, so, this is the solution. Iโve rebuilt snoot.club again and iโve decided just to trust everyone. All the snoots have access to the main machine, they have read permissions on eachotherโs website files (by default). And instead of ports the contract is that every snootโs server listens on a file called sock.
subs(1)in order to get this to work i needed to run a command simultaneously in every subdirectory of the /snoots folder and restart only jimmyโs server if only jimmy changed. For this i built a new tool called subs. itโs built in rust and itโs on crates.io. you can install it with cargo install subs.
Usage: subs [options] PROGRAM [root_dir]
Options:
-t, --type TYPE set the management type [choices: watch, socket, none]
-s, --socket NAME set the socket path. sending the socket a message like
"restart xxx" will restart the process running in the directory
"xxx". [default: ./subsocket]
-i, --watch-ignore PATTERN pattern to ignore when watching (matches whole path)
-h, --help get help PROGRAM will be run in parallel in every subdirectory
(SUB), as SUB's owner. A placeholder "{}" is available to PROGRAM, it will be
replaced with SUB.
[default: none]
In a kind-of unrelated move Iโve been trying to pull back from using Google, Facebook, and Microsoft products.
Facebook Iโm free from, the last thing was WhatsApp which i just straight up deleted and thatโs been fine. email me
Google is off my phone and out of my search bar, but I still use their office suite at work.
Microsoft I had been fairly free of, but then they bought GitHub and I got unfree. So Iโve gone back to emacs from Atom (iโm enjoying it) and Iโve deleted or archived all the code that was on github.com and set up a cgit server and put them all there.
If youโre a snoot you can add your own things to git.snoot.club by making a bare git repo in ~/git/whatever.git and pushing to it.
the next thing i need to work on is some kind of documentation site for talking new snoots through how to log in, set up git repos, run their page locally, deploy etc. after all recent changes, the helpful getting started guide that was provided to all snoots is wrong and bad.
also a doc page for explaining that installing dependencies and building assets is their responsibility, but the start script will be run by the server.
also so many other things.
โ chee (hi@chee.party) 2019-08-17
so now my stance is:
yarn(1)After deleting Instagram a few mornings ago, I thought Iโd use my GDPR data request to build a page that contained all the photos that used to be there. I wanted to be able to post to it later, and I wanted an RSS feed. I recently learned you can include a CSS stylesheet from an XML file, and was excited that this was the time to use that.
I built an RSS feed thatโs also the website for the feed ๐.
Before I send you the link, Disclaimer: * big page (30mb) * does not work on iOS * does not work on macOS Safari
Hereโs a link that you can add to your newsreader or visit in your browser: ๐ telecam. Isnโt that cool? i think itโs cool
In case youโre on one of the unsupported platforms, hereโs what it looks like:

Thereโs also a form for uploading new photos living at ๐ telecam/form which has filters (and the filters are written in Rust! it has Toast!)

Apple really did some real shitty 90s Microsoft-level Embrace, Extend, Extinguish move on their platforms with RSS. when News.app came out it was a generic newsreader, and they made it the handler for all RSS feeds (even if you had another RSS reader installed).
They stopped displaying RSS feeds in Safari or iOS Safari, and opened the News app automatically they came out with the Apple News Format and the Apple Publishing Platform
and then in (i think??) iOS 9.3 they stopped supporting RSS feeds from anything not in the publishing platform. but itโs still the default handler, and the Safaris still canโt display the feed, and News still hijacks it even if you have another newsreader installed
News.app hijacks your legit rss feed and then errors out with โCannot display content from this siteโ instead of letting you view the file or send it to your actual reader
please subscribe to my feed. the code, as always, is available the chee.party repo
like, subscribe, rate 5 stars, it really makes a difference folks.