and though bugs are the bane of my existence, rest assured the wretched thing will get the best of care here

...
 
Commits (15)
image: alpine/latest
packages:
- python3-pip
- py3-pip
- rsync
sources:
- https://git.sr.ht/~boringcactus/boringcactus.com
......@@ -18,5 +18,5 @@ tasks:
python3 ../cactus-ssg/build.py
- deploy: |
cd boringcactus.com
rsync -rP _site/html/ $deploy:/var/www/html/www.boringcactus.com/
rsync -rP _site/gmi/ $deploy:/var/gemini/gmi/boringcactus.com/
rsync --rsh="ssh -o StrictHostKeyChecking=no" -rlt8hP --del _site/html/ $deploy:/var/www/html/www.boringcactus.com/
rsync --rsh="ssh -o StrictHostKeyChecking=no" -rlt8hP --del _site/gmi/ $deploy:/var/gemini/gmi/boringcactus.com/
MIT License
Copyright (c) 2018 boringcactus
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{% if page.url != "/" %}=> / (brought to you by boringcactus)
{% if page.url != "index" %}=> / (brought to you by boringcactus)
{% endif %}# {{ page.title }}
{% if page.date %}## {{ page.date.strftime('%d %b %Y') }}
{% endif %}
......
......@@ -22,6 +22,8 @@
{% endif %}
<link rel="stylesheet" href="/assets/site.css">
<link type="application/atom+xml" rel="alternate" href="/feed.xml" title="boringcactus" />
<link type="text/gemini" rel="alternate" href="gemini://boringcactus.com/{{ page.url }}.gmi" />
<link rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/" />
<script async defer data-domain="boringcactus.com" src="https://stats.boringcactus.com/js/index.js"></script>
</head>
<body>
......
......@@ -5,10 +5,10 @@ title: "Lifehack: Running An Entire Desktop Session Remotely With MobaXterm"
Since my university has gone as remote as possible due to coronavirus, I was looking at ways to run an entire desktop session remotely over SSH, using MobaXterm because it is very cool.
Here are the two steps to doing that.
1. Open your MobaXterm settings, go to the X11 tab, and make sure that the server display mode is set to windowed mode.
If you run individual programs over X11 forwarding, this is worse, but for an entire desktop session it is better.
2. Duplicate your regular command line session that already works, and under the "Advanced SSH settings" tab, set "Execute command" to `env GNOME_SHELL_SESSION_MODE=ubuntu gnome-session --session=ubuntu`.
(If you're not running the same setup I am, look around in `/usr/share/xsessions/`, pick something that looks reasonable, and use everything after `Exec=` on the line with that.)
1. Open your MobaXterm settings, go to the X11 tab, and make sure that the server display mode is set to windowed mode.
If you run individual programs over X11 forwarding, this is worse, but for an entire desktop session it is better.
2. Duplicate your regular command line session that already works, and under the "Advanced SSH settings" tab, set "Execute command" to `env GNOME_SHELL_SESSION_MODE=ubuntu gnome-session --session=ubuntu`.
(If you're not running the same setup I am, look around in `/usr/share/xsessions/`, pick something that looks reasonable, and use everything after `Exec=` on the line with that.)
At this point, you should be set.
You'll need to hit the "log out" button to smoothly exit the connection.
......
......@@ -8,17 +8,17 @@ that's a good question; *are* we GUI yet?
Are We GUI Yet has a list of libraries for building GUIs: let's go through them in alphabetical order and see if we can build a simple to-do list with them without too much struggle.
some notes before we get started.
1. this is all extremely subjective.
2. the only ui toolkits i have used and not hated are Swing (i know), Electron (*i know*), and wxWidgets, which doesn't have Rust bindings because Rust bindings to C++ libraries are generously described as a nuisance to create (i've tried, and i'm writing this post instead of trying harder).
as such, i might be using some of these wrong, who knows.
3. i use windows, and so anything that's a nuisance to set up on windows is not going to fare well regardless of how cool it is once you get it working.
it could be the best thing since sliced bread or Meteor on release and i wouldn't care.
do not @ me.
4. the people who wrote these libraries have done more than i have to make the rust gui ecosystem not suck, and i don't want any of this to come across as suggesting that they suck and their work is bad.
the strongest thing i want to say is that a library is not designed in a way that i would want it to be designed, or that it doesn't work for me.
doing this shit at all is really goddamn difficult, and i don't want to minimize that by being unhappy with the results.
5. i started drafting this post in early July 2020, and finished it in late August 2020.
some things may have changed in the meantime while i wasn't paying attention.
1. this is all extremely subjective.
2. the only ui toolkits i have used and not hated are Swing (i know), Electron (*i know*), and wxWidgets, which doesn't have Rust bindings because Rust bindings to C++ libraries are generously described as a nuisance to create (i've tried, and i'm writing this post instead of trying harder).
as such, i might be using some of these wrong, who knows.
3. i use windows, and so anything that's a nuisance to set up on windows is not going to fare well regardless of how cool it is once you get it working.
it could be the best thing since sliced bread or Meteor on release and i wouldn't care.
do not @ me.
4. the people who wrote these libraries have done more than i have to make the rust gui ecosystem not suck, and i don't want any of this to come across as suggesting that they suck and their work is bad.
the strongest thing i want to say is that a library is not designed in a way that i would want it to be designed, or that it doesn't work for me.
doing this shit at all is really goddamn difficult, and i don't want to minimize that by being unhappy with the results.
5. i started drafting this post in early July 2020, and finished it in late August 2020.
some things may have changed in the meantime while i wasn't paying attention.
## azul
......@@ -150,12 +150,12 @@ if you're curious, you can take a look at [the source for our druid example](htt
so apparently druid is actually pretty darn usable.
i only have a couple tiny issues with it:
1. it doesn't use platform native UI widgets, so it doesn't look quite like a windows app should, and it won't look quite like a mac or linux app should either if i test it there.
this one is a feature as far as some people are concerned, but i am not on that list.
2. accessibility features like being able to tab between UI widgets are missing, so you'd have to roll those yourself in a real application.
maybe they'll add that by default in future versions, maybe not, but it would be neat if it existed.
3. high-level documentation is incomplete.
the individual struct/function docs are really good, but at a high level you don't really have a convenient place to jump in.
1. it doesn't use platform native UI widgets, so it doesn't look quite like a windows app should, and it won't look quite like a mac or linux app should either if i test it there.
this one is a feature as far as some people are concerned, but i am not on that list.
2. accessibility features like being able to tab between UI widgets (*update 2020-12-14*: and also literally any screen reader support) are missing, so you'd have to roll those yourself in a real application.
maybe they'll add that by default in future versions, maybe not, but it would be neat if it existed.
3. high-level documentation is incomplete.
the individual struct/function docs are really good, but at a high level you don't really have a convenient place to jump in.
i was about to add "no support for web" to that list, but even though the high-level docs don't mention it, the crate root docs and the examples do.
on the plus side, it just works, and i didn't have to make any changes to my code because i use [this patch to wasm-pack that lets you just use binary crates in wasm-pack](https://github.com/rustwasm/wasm-pack/pull/736) even though it hasn't been merged yet upstream.
......@@ -206,6 +206,8 @@ add_todo.set_callback(Box::new(move || {
we have to drag that position and size around manually.
i don't like that.
*update 2020-12-14*: also, it doesn't expose anything to screen readers.
overall, this technically works i guess, but i think the code is ugly and the style of the resulting application is also ugly.
we do get tab and space and everything working out of the box on buttons, which is always appreciated, though.
not broken or anything, not something i'd be likely to choose to use though either.
......@@ -249,6 +251,8 @@ compared to druid, i'd say the logic is a little more intuitive, the layout cont
the native build once again doesn't use native widgets and so once again doesn't get tab-between-fields or other accessibility features, but the web build uses actual HTML elements and so gets tab-between-fields for free.
high-level documentation is a little more robust here, plus the concepts are less complicated in the first place.
*update 2020-12-14*: screen reader support in the native build is again nonexistent, but the web build works alright, at least with the one i'm testing with.
so it's a little easier to get off the ground than with druid, and the results on the web are way better, but it's more difficult to make it look decent.
maybe that's just a documentation issue, but it's not ideal.
regardless, yet again we have a perfectly usable library.
......@@ -308,6 +312,8 @@ excitingly, we now have a demo that looks bad and also doesn't work:
excitingly, when we type some text and hit the "add" button, the text gets lost in the created todo, and i have no goddamn clue where it's going or what to do to fix it.
*update 2020-12-14*: also, a first so far, the native build actually provides some information to the screen reader! only some information - the checkbox labels come through, but the fact that they're attached to checkboxes doesn't - but still, it's closer than most of the other frameworks have managed to get.
the approach is interesting, though.
as i'm writing this neutrino is unmaintained and seeking a new maintainer, so hopefully somebody has the time and energy to steer it forwards.
......@@ -328,6 +334,8 @@ it does let us build a working todo list, and one that looks pretty nice:
i can't for the life of me figure out how to make the text field take up the entire width available to it.
but everything works, and we get built-in support for adding the todo on Enter in the text field, which is nice.
*update 2020-12-14*: screen reader support is, once again, nonexistent.
in theory, there's web support, but when i tried it it very loudly didn't work:
```text
......@@ -386,4 +394,4 @@ well, kinda.
druid works well if you want a straightforward layout experience.
iced works well if you want a straightforward render-update architecture, or actual HTML elements on Web.
everything else is, as of today, broken and/or more complex than i want.
and if you want native ui widgets to match your platform's look and feel, that's gonna be like a year away at least.
and if you want native ui widgets to match your platform's look and feel (*update 2020-12-14*: or be accessible at all), that's gonna be like a year away at least.
......@@ -3,7 +3,7 @@ title: "Crowbar: Defining a good C replacement"
---
I like Rust a lot.
That said, the always-opinionated, ~~often-correct~~ [occasionally-correct](https://cmpwn.com/@sir/104946211496582150) Drew DeVault raises some good points in his blog post [Rust is not a good C replacement](https://drewdevault.com/2019/03/25/Rust-is-not-a-good-C-replacement.html).
That said, the always-opinionated, ~~often-correct~~ [occasionally-correct](https://web.archive.org/web/20201020022457if_/https://cmpwn.com/@sir/104946211496582150) Drew DeVault raises some good points in his blog post [Rust is not a good C replacement](https://drewdevault.com/2019/03/25/Rust-is-not-a-good-C-replacement.html).
He names some attributes that C has and Rust lacks which he thinks are required in a good C replacement.
So what can we say are some features of a hypothetical good C replacement?
......
---
title: I'm tired of this anti-Rust horseshit
---
What do anti-vaxxers, flat earthers, 9/11 truthers, and anti-Rust activism
all have in common? All of them are characterized by a blithe rejection of facts
to embrace a narrative of victimization by a vague authority. In the case of
Rust, the "vague authority" are a bunch of volunteers who have devoted tens
of thousands of hours of their free time towards making free shit for you.
"Rust sucks!" is a conspiracy theory with no basis in truth, and its
supporters have spent years harassing Rust maintainers, contributors, and
users. And it's time for it to fucking stop.
Maybe Rust doesn't work for your precious use-case. More likely, it *does*
work, and you swallowed some propaganda based on an assumption which might have
been correct 7 years ago. Regardless, I simply don't give a shit about you
anymore. I've tried appealing to reason and rationally debunking each lie that
some Rust detractor flavor-of-the-week is touting to tow the party line, but
it didn't work. So my new approach is "fuck you". None of the Rust detractors
have a clue. They don't understand Rust, they don't understand C, they
don't understand memory safety or types or borrow checking or anything else in the
stack. They don't even understand what it's like to use Rust, because at most
they might have spent 5 minutes installing it, realized that something was
— gasp — *different* than C, and then uninstalled it and wrote
their angry Reddit comment.
It has a real cost, you know, being a dick to maintainers. It's not good for our
mental health. We're out here trying to make things better. Rust fixes
unfixable problems with C, and might have invented some new, fixable problems
in the process — most of which have been fucking fixed already, and years
ago! We've sacrificed our spare time to build this for you for free. If you turn
around and harass us based on some utterly nonsensical conspiracy theories,
then you're a fucking asshole.
If you really want to live in your propagandized world of Rust lies, then
fine. You're gonna maintain the C-based pyca/cryptography yourself, because we're not going to volunteer
our time, sacrifice our weekends and evenings staying up late for your sake,
just to maintain that broken pile of shit. You know what, if you fork it and
prove that you know what you're doing for a while, we'd probably just give you
the keys to upstream so you can maintain it yourself. If you do know what you're
doing, though, you'll soon realize you want nothing to do with that shitty
codebase.
Rust works for almost everyone, and works for *more* people than is even
possible with C. Most of the lies you've heard about ways that it's broken are
just that: lies. And if you insist on living in that fantasy, then keep it to
yourself, asshole.
(Without apologies to Drew DeVault.)
---
title: Not "Any Purpose"
---
> A program is free software if the program's users have the four essential freedoms:
>
> * The freedom to run the program as you wish, **for any purpose** (freedom 0).
>
> – [the Free Software Definition](https://www.gnu.org/philosophy/free-sw.html), emphasis mine
> Goddamn, what the fuck?\
> What the fuck, what the fuck?\
> Goddamn, what the fuck?\
> What the fuck?\
> Goddamn, what the fuck\
> What the fuck, what the—\
> What the fuck? What the fuck? What the fuck?
>
> – [745 sticky (Black Dresses Remix)](https://youtu.be/O1kTTOdHgC4)
My previous post on [post-open source](/2020/08/13/post-open-source.html) appeared to resonate with a lot of people, but unsurprisingly, not much has changed since then.
Recently, the company Elastic, who makes the database Elasticsearch, changed the license on Elasticsearch from Apache to the Server-Side Public License, which (to oversimplify [the analysis of the excellent Kyle E. Mitchell](https://writing.kemitchell.com/2019/06/13/SSPL-Not-Commons-Clause.html)) is AGPL but even more so.
And unsurprisingly, as happened with Redis and MongoDB before it, everyone got mad.
When I wrote this snippet of my post-open source post, I was referring to Redis, but it's the exact same playbook that's happening again now:
> you made a cool database server that's under an open source license?
> amazon's selling it as a service now, and they're not paying you a fuckin dime.
> you want to change your license to stop them from doing that?
> now the open source people are yelling at you, because when they say they're apolitical they mean they support the status quo.
> and the free software people are also yelling at you, because you didn't do it their way with their license, you did it a different way with a different license, and that goes against amazon's freedom to screw you over.
So we're back here again.
Open source ideology leads to intra-corporate exploitation, the exploitees want to get out from under the exploiters, everyone gets mad that the status quo has been upset, and Amazon forks the last permissively-licensed version of the software and laughs all the way to the bank.
The only way for Elastic to win would've been to have licensed Elasticsearch under something restrictive like the SSPL from day one.
But since they didn't, we get shit like this:
> Capitalism concerns itself with making monopolies — FOSS instead concerns itself with the socialized creation of software wealth.
>
> – some jackass who loves being wrong on the internet
FOSS is not socialist. The free software movement is [right-libertarian / "anarcho"-capitalist](https://lipu.dgold.eu/original-sin.html), and the open source movement is neoliberal; neither of these is even particularly close to socialism.
If you want a software ideology that is actually opposed to capitalism, instead of sucking up to capital, you might be looking for [the Anti-Capitalist Software License](https://anticapitalist.software/).
It's good, it links to my previous writing on post-open source (and the Fuck Around and Find Out License), and the FSF hate it:
> The Anti-Capitalist Software License is a nonfree license because it extends the four freedoms only to some kinds of organizations, not to all.
> Such a restriction in a software license, in the name of any cause whatsoever, imposes too much power over users.
> Please don't use this license, and we urge you to avoid any software that has been released under it.
What's not to love!
As an author of some software released under the Anti-Capitalist Software License, I also urge people who take the FSF seriously to avoid my software which has been released under the ACSL.
And my software released under any other license.
And just me in general.
Unsurprisingly, Richard M. Stallman (the "M" stands for "Making female students extremely uncomfortable [for 30 years](https://selamjie.medium.com/remove-richard-stallman-appendix-a-a7e41e784f88)") has done some handwringing about the vital importance of Freedom 0's "for any purpose" that we can make fun of.
Essentially, his points are
* enforcement against governments or big corporations is impossible because they can just make excuses and dodge jurisdiction and accountability
* for small stuff, ethics vary, so if we accept a thousand orthogonal usage restrictions ("only this music genre", "can't be used in meat processing because i'm vegan", etc) we'll have a shitshow of an ecosystem and everyone will just give up and go back to using "nonfree" software
* who are we as developers to even tell users what they can and can't do with our software? you wouldn't buy a pen that had a "you can't use this pen to do X" on it, right? that'd be ridiculous!
First, lmao, "don't bother doing this because enforcement is impossible" applies equally to copyleft and the GPL in general.
Second, if we set aside masturbatory trolling bullshit like Bruce Perens's "Vaccine License", nobody makes licenses that are that narrowly tailored to one specific thing - and even the Vaccine License is still a world away from a hypothetical Country Music Only License or Vegan Software License or what have you.
This is a textbook slippery slope argument, and if you think "you can't use this software to violate human rights" is anywhere near "you can't use this software to listen to BTS" then fuck all of the way off.
(Although, one time I mentioned on IRC that I was throwing a simple script together in Python, and someone said "Hopefully it's Python 2, but if not I'll just rewrite it in Python 2", so I threw together the [Why The Fuck Would You Even Do That Holy Shit Public License](https://git.sr.ht/~boringcactus/gotbruh/tree/main/item/LICENSE.md) to prohibit exactly that.)
Third, god *damn* libertarians hate when anyone tells them that some actions are bad.
If I was going to buy a pen, and I saw that it had a "hey, don't use this pen to violate human rights" sticker on it, I would go "fair enough I guess" and just buy the damn pen.
The libertarian position here is that toolmakers should have no say in how those tools are used, and the only way they should control what can be done with their tools is by directly adding or removing capabilities from the tools.
Unsurprisingly, the libertarian position here is bullshit.
A tool is not a morally neutral thing, and toolsmithing is not an act which must by necessity end when the tool leaves the smith's hands.
Let me now list some of the ethical principles from the [ACM Code of Ethics](https://ethics.acm.org):
> A computing professional should...
> 1. Contribute to society and to human well-being, acknowledging that all people are stakeholders in computing.
> 2. Avoid harm.
> 3. Be honest and trustworthy.
> 4. Be fair and take action not to discriminate.
> 5. Respect the work required to produce new ideas, inventions, creative works, and computing artifacts.
Points 1 and 2 are broadly aligned with the idea that software should be used for good, and point 5 suggests that authors should be compensated for their work.
As such, ethical restrictions in software licenses are perfectly compatible with this code of ethics, as are restrictions on commercial use.
It is possible to go even further than this, and I think I will, because I'm in the mood to start some fights:
In my view, **it conflicts with the ACM Code of Ethics to release software under a license which permits ethical misconduct and economic exploitation.**
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
<link href="/feed.xml" rel="self" type="application/atom+xml" />
<link href="{{ root }}/feed.xml" rel="self" type="application/atom+xml" />
<link href="{{ root }}/" rel="alternate" type="{{ mime }}" />
<updated>{{ now }}</updated>
<id>/feed.xml</id>
<updated>{{ now.isoformat() }}Z</updated>
<id>{{ root }}/feed.xml</id>
<title>boringcactus</title>
<subtitle>boringcactus's blog posts</subtitle>
<author>
......@@ -16,8 +16,8 @@
<link href="{{ root }}/{{ post.url }}.{{ ext }}" rel="alternate" type="{{ mime }}" title="{{ post.title }}" />
<published>{{ post.date }}T00:00:00Z</published>
<updated>{{ post.date }}T00:00:00Z</updated>
<id>{{ post.url }}</id>
<content type="{{ mime }}">{{ post | attr(content_attr) }}</content>
<id>{{ root }}/{{ post.url }}.{{ ext }}</id>
<content type="{{ content_type }}">{{ post | attr(content_attr) }}</content>
</entry>
{% endfor %}
</feed>
......@@ -15,8 +15,15 @@ i exist in a lot of places:
- give me money once on [ko-fi](https://ko-fi.com/boringcactus) or on an ongoing basis on [patreon](https://www.patreon.com/boringcactus)
- if you must, email me at `melody@<this domain>`
currently, by night i'm a PhD student in Dr. Leah Buechley's [Hand and Machine research group](https://handandmachine.cs.unm.edu/), and by even later night i intermittently work on side projects.
every once in a very great while i write things here:
{% for post in posts %}
- [{{ post.title }} ({{ post.date.strftime('%d %b %Y') }})](/{{ post.url }}.md)
{% endfor %}
[![Creative Commons BY-NC-SA License](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)](https://creativecommons.org/licenses/by-nc-sa/4.0/)
The content of this website is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/).
(If you've got a font that supports them, the Unicode symbols for this license are 🅭 🅯🄏🄎, but most fonts probably don't.)
......@@ -3,71 +3,117 @@ layout: default
title: Projects
permalink: /projects/
---
* JavaScript
* Developed games
* with [HTML and React](https://github.com/mathphreak/halfhearted)
* with [just the Canvas API](https://github.com/mathphreak/Zrczr)
* with [a pure-HTML text UI](https://github.com/mathphreak/LD28-You-Only-Get-One)
* with [a full HTML5 game engine and a team of people](https://github.com/mathphreak/Galactic-Max)
* with [Elm](https://github.com/mathphreak/yummy-goodness)
* Developed Web apps
* a React front-end for a Java back-end as part of a group project
* [a specialized todo list](https://github.com/mathphreak/hamwerk) with Meteor
* [a realtime quiz application](https://github.com/KamikazeKumquatsLLC/komodo) with Meteor
* [a status dashboard](https://github.com/mathphreak/MCWebDash) pulling data from a Java backend via UDP
* Developed libraries
* [remembering scroll position on a page](https://github.com/mathphreak/Pecan.js)
* [interacting with the GitHub API from the browser](https://github.com/mathphreak/github.js)
* [sorting strings in a natural-language-friendly way](https://github.com/mathphreak/compare-ignoring-articles)
* Developed desktop programs with Electron
* [for moving files around with a decent UI](https://github.com/mathphreak/ReliefValve)
* [for diffing output of two programs](https://github.com/mathphreak/verbatim)
* Developed a [Chrome extension](https://github.com/mathphreak/VCRI) making improvements to an existing site
* Rust
* [Wrote a text editor inspired by Nano](https://github.com/mathphreak/mfte)
* [Made a Web app](https://github.com/mathphreak/cs-eco-dash) that consumed and processed data given in a poorly specified format
* Contributed to [the standard library](https://github.com/rust-lang/rust/pull/34694) and [wasm-bindgen](https://github.com/rustwasm/wasm-bindgen/pull/1843)
* Python
* Wrote a [wxPython GUI](https://github.com/boringcactus/vidslice) for video manipulation using ffmpeg and youtube-dl
* Wrote an [image processing](https://github.com/mathphreak/hexcells_hints) utility
* Contributed to [a GroupMe chat bot](https://github.com/Boijangle/GroupMe-Message-Bot)
* Java
* Developed a Spring back-end for a React front-end as part of a group project
* Developed desktop programs in Swing
* [a homework-specific todo list](https://sourceforge.net/projects/eplanner/) (my first open source project, in 2009)
* a CSV data processor
* Developed Android apps
* [Bluetooth-based robotics control system](https://github.com/mathphreak/RobotArmStuff)
* competition status tracker
* Developed plugins targeting an existing API (Bukkit, for Minecraft)
* for a client [1](https://github.com/mathphreak/StaffDrops) [2](https://github.com/mathphreak/CompetentDeathMessages)
* in collaboration with other developers [1](https://github.com/mathphreak/Fireworks) [2](https://github.com/mathphreak/RepublicaEternityEventIII)
* for my own needs or to test what was possible [1](https://github.com/mathphreak/SpawnAndBack) [2](https://github.com/mathphreak/Trollcraft)
* C++
* Wrote an XPM decoder and a basic GUI layout library targeting a single-pixel-based graphics library
* Open Source Contribution
* Contributed features
* [to a newly created Rust library, from scratch](https://github.com/mrandri19/rust-editorconfig)
* [to the Rust standard library](https://github.com/rust-lang/rust/pull/34694)
* [to a Chrome extension](https://github.com/honestbleeps/Reddit-Enhancement-Suite/pull/826)
* [to a large Minecraft server plugin](https://github.com/Multiverse/Multiverse-Core/pull/780)
* twice to a widely used Node.js library [1](https://github.com/joaomoreno/gulp-atom-electron/pull/28) [2](https://github.com/joaomoreno/gulp-atom-electron/pull/29)
* Fixed bugs/issues
* [bugs in CMake test configuration](https://github.com/editorconfig/editorconfig-core-test/pull/8)
* [grammar in documentation](https://github.com/jonobr1/two.js/pull/3)
* [outdated and broken dependencies](https://github.com/aweinstock314/rust-clipboard/pull/43)
* Ruby
* Developed Web applications
* [Docker-based code runner](https://github.com/mathphreak/E-800) (with Rails)
* [Gmail API client](https://github.com/mathphreak/cull21) (with Sinatra)
* Developed a [productivity daemon](https://github.com/mathphreak/prodenfd)
* Go
* Wrote a [Web-based dashboard](https://github.com/mathphreak/AltcoinNetWorth) and [WebSocket chat](https://github.com/mathphreak/webchat-go)
* Wrote [a proxy server and API client](https://github.com/mathphreak/statdns-socks5)
* [Ported cryptography-related C code to Go](https://github.com/mathphreak/reop)
* Embedded
* [Programmed and built a motorized trebuchet](https://github.com/mathphreak/Arduinochet)
* Adapted existing code to [pass light sensor data to a computer for audio](https://github.com/mathphreak/piano-stairs).
* General Programming Knowledge
* Translated [someone else's ActionScript synthesizer](https://code.google.com/archive/p/tonfall/) into [pseudocode](https://github.com/mathphreak/tripping-wight)
* Wrote [an emulator in CoffeeScript](https://github.com/mathphreak/BecauseWhyNot) for a CPU based on specs written as lore for a video game that was later canceled
* November 2020: [cactus-ssg](https://git.sr.ht/~boringcactus/cactus-ssg), a Python static site generator targeting both WWW and Gemini (built this site right here!)
* September 2020: [Crowbar](https://crowbar-lang.org), a language offering "the good parts of C, with a little bit extra"
* September 2020: [gemifedi](https://sr.ht/~boringcactus/gemifedi/), a Rust server offering a Gemini frontend to the fediverse
* September 2020: [csgo-gsi](https://sr.ht/~boringcactus/csgo-gsi/), a Rust library for integrating with CS:GO
* August 2020: [the Fuck Around and Find Out License](https://sr.ht/~boringcactus/fafol/), an experimental software license
* June 2020: [Slabforge](https://handandmachine.cs.unm.edu/slabforge/), a JS CAD tool for slab-built ceramics
* June 2020: [pig.observer](https://pig.observer), a JS frontend for viewing several traffic camera streams simultaneously (finished)
* December 2019: [cargo-why](https://sr.ht/~boringcactus/cargo-why/), tracing dependency paths to show why a Rust crate is needed in the current project
* December 2019: [wasm-pack pull request #745](https://github.com/rustwasm/wasm-pack/pull/745), adding watch and serve subcommands
* November 2019: [wasm-pack pull request #736](https://github.com/rustwasm/wasm-pack/pull/736), adding support for binary crates (finished)
* October 2019: [wasm-bindgen pull request #1843](https://github.com/rustwasm/wasm-bindgen/pull/1843), adding support for binary crates (finished)
* October 2019: [OWReplayRenderer](https://github.com/boringcactus/OWReplayRenderer), a utility in Rust to render out Overwatch replays to a single video file automatically
* September 2019: [micro-ci](https://github.com/boringcactus/micro-ci), a tiny self-hosted CI system written in Rust
* September 2019: compiler for the [While programming language](https://www.oxfordreference.com/view/10.1093/oi/authority.20110803122041931), written in Rust as a group project for a compilers class
* June 2019: [faketwitch](https://github.com/boringcactus/faketwitch), an IRC server shim in Python to allow Twitch-chat-integrated games to use other services instead of Twitch
* February 2019: [vidslice](https://github.com/boringcactus/vidslice), a wxPython GUI wrapping youtube-dl and ffmpeg (finished)
* January 2019: [kink.garden](https://github.com/kinkgarden/kinkgarden), a (NSFW) Django service for maintaining lists of kinks (finished)
* January 2019: [DynaMaze](https://github.com/boringcactus/dynamaze), a Rust-based multiplayer game compiled to WebAssembly (finished)
* December 2018: [crabravebot](https://git.sr.ht/~boringcactus/crabravebot), a Python (originally JS) service for easily overlaying text over Crab Rave
* August 2018: undergraduate thesis on natural language processing and textual entailment (finished)
* February 2018: full stack web application with Spring, React, and Elasticsearch for a software engineering class (finished)
* October 2017: [functional-dependency-generator](https://github.com/mathphreak/functional-dependency-generator), a PHP site that generates database theory example problems (finished)
* August 2017: [rust-editorconfig](https://github.com/mrandri19/rust-editorconfig), an editorconfig library for Rust that I substantially contributed to
* July 2017: [MFTE](https://github.com/mathphreak/mfte), a Nano clone written in Rust
* April 2017: graphics library exposing XPM and Swing-like layout interfaces and targeting a set-one-pixel-at-a-time renderer
* March 2017: [cull21](https://github.com/mathphreak/cull21), a Ruby web-based Gmail API client designed specifically for powering through backlogs (finished)
* January 2017: [Yummy Goodness](https://github.com/mathphreak/yummy-goodness), a JS game built with Elm (finished)
* September 2016: [prodenfd](https://github.com/mathphreak/prodenfd), a Ruby program that doesn't let me play games if I have pending tasks in my todo list due soon (finished)
* August 2016: [verbatim](https://github.com/mathphreak/verbatim), an Electron application for integration testing an actual binary against an expected one (finished)
* July 2016: [Rust pull request #34694](https://github.com/rust-lang/rust/pull/34694), adding trivial helper methods to the `IpAddr` enum
* June 2016: [halfhearted](https://github.com/mathphreak/halfhearted), a JS game built with just React (finished)
* January 2016: [compare-ignoring-articles](https://github.com/mathphreak/compare-ignoring-articles), a JS library for sorting in a natural way
* January 2016: [Galactic Max](https://github.com/mathphreak/Galactic-Max), a JS game built on Phaser with a full team for a hackathon (finished)
* December 2015: [CS Eco Dash](https://github.com/mathphreak/cs-eco-dash), a Rust web application taking [CS:GO data](https://developer.valvesoftware.com/wiki/Counter-Strike:_Global_Offensive_Game_State_Integration) and presenting recommendations
* September 2015: [E-800](https://github.com/mathphreak/E-800), a Rails web app for running and grading student-submitted code
* August 2015: Java application translating CSV exports from one program to be importable by another, with a Swing GUI
* June 2015: [Relief Valve](https://github.com/mathphreak/ReliefValve), an Electron application for moving Steam games between libraries (finished)
* March 2015: [statdns-socks5](https://github.com/mathphreak/statdns-socks5), a Go proxy server for DNS-over-HTTP before it was cool
* November 2014: [komodo](https://github.com/KamikazeKumquatsLLC/komodo), a Web-based realtime quiz system powered by Meteor
* May 2014: [AltcoinNetWorth](https://github.com/mathphreak/AltcoinNetWorth), a Web-based dashboard for an altcoin portfolio, written in Go
* December 2013: [LD28-You-Only-Get-One](https://github.com/mathphreak/LD28-You-Only-Get-One), a Backbone-powered textual JS game
* August 2013: [hamwerk](https://github.com/mathphreak/hamwerk), a Web-based todo list specialized for homework powered by Meteor (finished)
* July 2013: [MCWebDash](https://github.com/mathphreak/MCWebDash), a Web-based dashboard showing the status of a Minecraft server
* June 2013: [SpawnAndBack](https://github.com/mathphreak/SpawnAndBack), a simple Minecraft mod
* March 2013: [BecauseWhyNot](https://github.com/mathphreak/BecauseWhyNot), a CPU emulator written in CoffeeScript for the DCPU-16 fictional CPU from Notch's cancelled 0x10c.
* March 2013: [CompetentDeathMessages](https://github.com/mathphreak/StaffDrops), a Minecraft server plugin
* January 2013: [Republica Eternity Event III](https://github.com/mathphreak/RepublicaEternityEventIII), a Minecraft server plugin some friends needed help with
* November 2012: [StaffDrops](https://github.com/mathphreak/StaffDrops), a Minecraft server plugin a friend needed help with
* July 2012: [Multiverse Core pull request #780](https://github.com/Multiverse/Multiverse-Core/pull/780), adding a feature to a Minecraft server plugin
* October 2011: [github.js](https://github.com/mathphreak/github.js), a library for making client-side calls to the GitHub API
* May 2011: [Zrczr](https://github.com/mathphreak/Zrczr), a canvas-based JS game
* May 2011: [Pecan.js](https://github.com/mathphreak/Pecan.js), a library for persisting scroll position
* March 2011: [VCRI](https://github.com/mathphreak/VCRI), a Chrome extension tweaking an existing JS game (finished)
* January 2011: [Arduinochet](https://github.com/mathphreak/Arduinochet), a needlessly-motorized trebuchet I built with a friend
* February 2010: [Acts 20:2](http://sourceforge.net/projects/acts202/), a Java Swing application displaying periodic popups of Bible verses, which I built in collaboration with a few other people
* January 2009: [EPlanner](https://sourceforge.net/projects/eplanner/), a todo list specialized for homework built in Java with Swing
(these are start dates, because that's what made sense to me at the time)