Reading List

The most recent articles from a list of feeds I subscribe to.

Games I've been playing lately

Here’s what I’ve been playing these days:

Neon Abyss

I played it back when it was on Xbox Games Pass. I stopped playing for a while (I thought it left Games Pass, but it’s available there right now), but then I saw it available for free on the Epic Games Store, so I downloaded it and started playing again. It’s a roguelike shooter. Perfect for when I want to chill out for a while.

Halo Wars 2

It’s pretty good. I don’t play many real-time strategy games, but I like this one. I was terrible at first and almost uninstalled it after a couple of tries. But then I started to figure out how to win (against the CPU) and played a lot more. Not good for when I want to chill out. The game is stressful.

Portal Reloaded

This is a mod for Portal 2 that adds a third portal you can place that moves you back and forth between present and future timelines. The stuff you do in the present (move a block, push a button, etc) affect those same things in the future timeline. But the stuff you do in the future does not affect the things in the past. So difficult Portal 2 puzzles that deal with your position in space, but in two timelines. It’s really good.

Death’s Door

Very cool Zelda-inspired indie action/RPG game that Monique bought for me. She also got a copy for herself and is having a good time with it. I wish it had some kind of co-op.

Remnant: From the Ashes

Speaking of co-op… I’ve been playing this one with Monique. We’re only like an hour in, but it’s been fun. We have really been struggling to find good PC co-op games that aren’t buggy and we’re both into, but this one works for now.

RetroArch

I’ve had the standalone version of RetroArch (frontend app for game console emulators) installed on my PC for a while, but I just decided to try out the Steam version of it, mostly so I can try out using Steam Link to do some retro gaming on my phone. Steam RetroArch works as well as the standalone version for me, so I don’t use the old one anymore.

Importing my ROMs was easy enough, but you have to use cores (the actual emulators for each console) that are listed in the store as DLC instead of using your own files, so I had to download them all. But it was easy and they have all the cores most people would want.

Steam Link worked well, except I still am not used to using touch screen controls to emulate a whole controller. I’m terrible at it. I don’t know how you’re supposed to do joysticks, face buttons, and shoulder buttons at the same time on a screen.

Anyway, some of my favorite ROMs:

  • Super Metroid (SNES)
  • A Link to the Past (Zelda) (SNES)
  • Castlevania: Symphony of the Night (PSX)
  • Resident Evil - Director’s Cut - Dual Shock Version (PSX)
  • Resident Evil 2 (N64)
  • Silent Hill (PSX)
  • Dino Crisis (PSX)
  • Shadowrun (GEN)
  • Shinobi III (GEN)
  • Ecco - The Tides of Time (GEN)
  • Metroid - Zero Mission (GBA)
  • Majora’s Mask (Zelda) (N64)

And just random some games I had that I still play to go back in time for a little while:

  • Kung Fu (NES)
  • The Legend of Zelda (NES)
  • Metroid (NES)
  • Teenage Mutant Ninja Turtles (NES)
  • Zelda II (NES)
  • Batman Returns (GEN)
  • Beyond Oasis (GEN)
  • Comix Zone (GEN)
  • Splatterhouse 3 (GEN)
  • Vectorman (GEN)
  • Donkey Kong Country (SNES)
  • Earthworm Jim (SNES)
  • Flashback - The Quest for Identity (SNES)
  • Mighty Morphin Power Rangers (SNES)
  • Pitfall - The Mayan Adventure (SNES)
  • Super Mario World 2 - Yoshi’s Island (SNES)
  • Terminator 2 - Judgement Day (SNES)
  • Blood Omen - Legacy of Kain (PSX)
  • Grand Theft Auto (PSX)
  • Metal Gear Solid (PSX)
  • Nightmare Creatures (PSX)
  • PaRappa the Rapper (PSX)
  • Parasite Eve (PSX)
  • Tekken 2 (PSX)
  • Twisted Metal 2 (PSX)
  • Metroid Fusion (GBA)

The Expanse

I’m watching the last season of The Expanse and still really into it. But I can’t help but feel sad every time I think about how short the season is. I really want more sci-fi like this.

1 Full Year of Freelance Development

I started freelancing in August last year.

By that point, we had gone through a few months of the COVID-19 pandemic, and I was working full time for a company here in NYC that makes a marketing data aggregation and reporting platform. I was already feeling burnt out from my career, and having to do daily standups (at one point, I was on two different teams, with two different sets of daily and weekly status update meetings 🙄) for a product I wasn’t excited about while dealing with a whole pandemic had me rethinking what I was doing with my career.

So I quit the company I was working for and started an LLC for freelance development.

This August marked a full year of self-employment. And the end of this year will be the first entire year I did it on my own.

Here’s how it went:

Income

Eh. I haven’t make all that much so far. Revenue wasn’t really my main goal for the first few years of this thing, so no surprise there. I was able to pay for my NYC apartment, my own health insurance, and all my bills (with some help from my partner Monique, my family, and a few contributors to the website 🙏🏾), so I did well enough.

I’m trying to balance client work, which pays very well, with working on my own projects, which does not (yet).

When it comes to expenses though, luckily this is a profession that doesn’t cost all that much to do, besides some hardware costs. That’s good for my bank account, but probably not so good for my tax bill I’m guessing.

Clients

I only worked with 4 clients this year. When I first started doing this, I thought I might end up doing a lot of small projects through Upwork or Fivver, or from people I knew who needed small websites made. But that route is way more work and pays way less than working on the bigger (and more enjoyable) projects I like.

Some of the client work was tough, like with a smaller client who was trying to get a site done on a tight deadline, but didn’t really know how they wanted it to get done. Or with very design focused agency that didn’t seem to fully understand or respect the development process. But it was a good kind of tough, because it was just me fighting for myself and doing what it takes to deliver good shit and get paid. I think I’ve done a pretty good job so far.

Work

I love that I got to work with few different languages/platforms for clients this year:

  • Shopify
  • Plain HTML/CSS with heavy use of CSS Animations
  • CraftCMS/React (Craft is a PHP framework, but I wrote a React app on top of it in headless mode)
  • C/C++ (with GTK) on Linux (using libobs for webcam, screen, and mic capture)
  • Multi-platform (macOS/Linux/Windows) Rust code
  • Lots of Go and Javascript for the stuff here on this website

This is exactly the kind of thing I was hoping would happen when I started freelancing. I like working with all different kinds of tech and figuring out what the advantages and disadvantages of different approaches are.

Work/Life Balance

I’m a freelance developer who still genuinely loves writing code, so work and life kinda end up being the same thing. Most of my time (post-COVID) is spent on a computer building stuff. But I made sure that I balanced how much of that time building was for someone else or for myself. And if I planned this well enough, the stuff I end up doing for myself should be able to bring in enough income that I won’t have to do much client work at all.

So this year, I’ve actually had a lot of time to do what I wanted (besides going out and exploring/hanging out in the city, which has been way too rare these last few years).

Hopefully next year I can actually comfortably work somewhere other than in this apartment and enjoy the mobility I’m supposed to have while doing this kind of thing.

Networking

One of the things freelancing was supposed to help me with is with focusing on networking with people. I was really excited about pushing myself to go out and talk with people more often to make my living. But then waves of COVID infections kept hitting, and I stayed inside and focused and didn’t really put that effort in. I ended up accomplishing a lot on my own, which both feels good and kinda sucks at the same time.

For a few years now, I’ve kept hoping the next year’s situation will be better. Here we go again with 2022. Networking (and generally working on my friendships and social circle) will be a big focus for me next year.

Overall Happiness

Freelancing is a pretty uncertain and stressful thing sometimes. But I definitely prefer it over having a steady income but feeling stuck in a position (or company) I don’t really want to be in.

This year, I’ve felt really good about how I made my money and really happy about the freedom I have to choose the projects I want to take on.

Of course, all of this is in the shadow of this terrible COVID situation we’ve all had to deal with. The pandemic is what pushed me to change how I do things, and reflecting on how happy I am after adjusting my life to cope with something like this is awkward.

But I do feel like I was able to adjust pretty well, and I’m very happy about the decisions I’ve made these last few years, so I would say overall happiness has been pretty good.


Luckily I feel very nicely setup to continue down this path and accomplish even more next year. I’ll be continuing to work with one of my clients through the new year, and I have some potential agency work coming up in a few months. 2021 was obviously difficult in a lot of ways, but overall things turned out okay for me. 🙂

I hope 2022 is a much better year for all of us.

My Web Architecture

I’m thinking about rewriting my web server apps in Rust.

Right now, this website is being served from a Go app I wrote. It’s a web server app, but also handles DwayneBot and my RSS reader. It’s all one executable running on one physical web server.

There’s a lot of things I like about Go (simplicity and speed mostly), and a few I don’t. As I was thinking about future plans for the website, I started thinking about rearchitecting things and potentially switching languages.


Hardware

All of the hardware I’m using is rented from Digital Ocean. I’m using a managed Postgres server and one Droplet (Ubuntu server) for all the dwayne.xyz services. Eventually I want at least one additional CPU focused Droplet for self-hosted live streaming, and potentially one more cheap/small server to put some of the secondary services (TURN/STUN server, LibreTranslate, IRC, etc) on.


Services

The services I run (and wrote myself) on this Droplet are:

  • Web Server - Calls third party APIs, connects to my database, exposes an API, and serves HTML
  • RSS Reader - Requests and processes RSS items from my list of feeds (you can see the result here)
  • DwayneBot - Accepts and processes questions and commands, provides a REST API and WebSocket endpoints (you can see how it responds here)
  • chat-bot - A badly named server process that connects to both the DwayneBot process and IRC/Twitch chatrooms

Secondary services (I didn’t write these):

  • TURN/STUN Server - For the WebRTC based chats I host here
  • IRC Server
  • LibreTranslate
  • Gitea - My code repos
  • Fathom - For website analytics

All of the services in the first group (besides chat-bot) are part of the same Go server process. It and the chat-bot process communicate through WebSockets.


New Architecture

In order to actually take advantage of multiple Droplets, I’m thinking I should split all the stuff I wrote into the following:

  • API/Backend service
  • RSS reader service
  • Web server
  • DwayneBot service
  • chat-bot service (I really need a better name for this)

And use something more efficient than WebSockets to communicate directly between them (like any built-in IPC/RPC mechanism). And then something like memcached as a shared cache for all of them.

So why do all this?

Advantages/Disadvantages

Pros

  • Update, restart, and move (between Droplets) processes more easily
  • I can add more Droplets and/or services to the system in a more organized way
  • It’s a good opportunity to rewrite and improve parts of this project
  • I can pick a more exciting/interesting language than Go

Cons

  • Lose some simplicity and efficiency
  • Rewriting all this code will take some time
  • Every time I start mentally planning this out and reviewing what I have so far, I realize how much I really like what I have so far
  • The setup I’m using can already support many, many times more visitors than I’m currently getting, so this is definitely unnecessary from a performance/price (Droplets aren’t cheap) perspective

Languages

I mentioned using Go a few times. It’s actually served me really well this whole time and I’m not sure I really want to stop using it. But, part of my motivation for all of this is to learn stuff and keep myself up to date so I started thinking about what I might use instead. Some of the options:

Rust

The new thing. Fast, modern, memory safe/efficient. The only problem is I just don’t like the syntax. Like… it’s fine, but I’m just not that excited about actually reading/writing the code.

C++

Yes, C++. I’ve been using it for some Linux GTK development lately and I miss it. I’ve heard good things about some of the C++ web server frameworks that are “popular” these days. But I wouldn’t really be keeping myself up to date by using a language that’s literally as old as I am.

Deno

Deno is similar to Node, but it uses Typescript natively and avoids the entire NPM ecosystem. Every time I read about it, I want to use it even more. It would be an extremely easy and comfortable environment for that I’m trying to do. Interestingly, it’s built on both C++ (for the V8 Javascript interpreter) and Rust. It would be weird to use a language/runtime that sits on top of a language I could just use directly though.

Go

I could just stick with Go and either change the architecture anyway or just… leave things the way they are. One thing that’s been on my mind about Go is the recent addition of Generics. Generics are great, but so far this implementation feels kinda bolted on just because there were too many complaints about them being missing. I’m not looking forward to an awkward couple of years of all the libraries trying to figure out the best way to implement them.

Other

I’m not really considering Java (even though Clojure is one of my favorite languages), PHP, Ruby, Python, or .NET.


So?

I still haven’t decided what to do. If I choose another language, I estimate it’ll take a few months before I can start testing. So it’s probably worth just trying a few things out over the next few weeks and see what feels right.

Time to start writing some more Rust.

The ConstitutionDAO Failure

The ConstitutionDAO. From the FAQ:

So, what’s going on?

We’re buying the US Constitution.

For the first time in thirty-three years, one of thirteen surviving copies of the Official Edition from the Constitutional Convention will be publicly auctioned by Sotheby’s. It is one of the two copies that are still owned by private collectors. The proceeds from the auction will be given to a charity that has been established by the current owner.

ConstitutionDAO is a DAO that is pooling together money to win this auction. We intend to put The Constitution in the hands of The People.

This was attempted on Nov 18th, but the group lost the auction.


Some quick, simplified, definitions:

Crypto - Cryptocurrency: A form of currency that uses a ledger instead of physical objects to record who owns what. The things you own are interchangeable (fungible) tokens. For example, a Bitcoin. Basically digital dollar bills. Note: There are many cryptocurrencies, and each one is its own ledger. For example: Bitcoin, Ethereum, Dogecoin, and Litecoin are all individual currencies/ledgers.

NFT - Non Fungible Token: Tokens, from the definition above, that are not interchangeable. Basically, like a dollar bill that you drew or wrote something unique on so that you can then sell to someone else. A lot of the talk of NFTs have been about ones that link to artwork, but they can be any unique crypto token. Note: Because these are digital, they can also be programmed and can execute actions.

DAO - Decentralized Autonomous Organization: Any kind of organization whose rules are encoded as a program instead of through actual verbal/written agreements or contracts between people. DAOs are popular these days because you can use NFTs to keep track of ownership, votes, etc.


So, becoming a part of the ConsitutionDAO meant buying one of the specific tokens of a specific cryptocurrency that states that you have some ownership in the organization. In the strained analogy to real money I’ve been using, it would be like finding a group that took a bunch of dollar bills, wrote a special symbol on each one (now they’re not fungible), sold them, and then said something like, “Every person that owns one of these gets a say in our thing. The more you own, the more votes you get.”

And, like with most NFTs, there’s always the possibility that you can probably sell those tokens for even more (fungible) money later when people see how cool the thing/organization is of course.

With the ConstitutionDAO, not only did people get to be a part of the organization, but they were also contributing to the fundraising effort too. Most people understood that that’s how it worked, and the group may or may not succeed at the auction. If they succeeded, then everyone involved got a say in what happened next. If they didn’t succeed, at least they would have gotten the word out about DAOs and this interesting fundraising effort. And people would still get a say in what happened next.

So what did happen? Some billionaire (Ken Griffin), who obviously knew exactly how much money ConstitutionDAO had to work with, outbid them.


Now, for the messy part.

Jordan Pearson, from an article titled ‘Buy the Constitution’ Aftermath: Everyone Very Mad, Confused, Losing Lots of Money, Fighting, Crying, Etc.:

The community of crypto investors who tried and failed to buy a copy of the U.S. Constitution last week has descended into chaos as people are realizing today that roughly half of the donors will have the majority of their investment wiped out by cryptocurrency fees. Meanwhile, disagreements have broken out over the future of ConstitutionDAO, the original purpose of the more than $40 million crowdfunding campaign, and what will happen to the $PEOPLE token that donors were given in exchange for their contributions.

Some cryptocurrencies have fees attached to every transaction. It’s additional cryptocurrency you pay during the transaction that gets distributed back to the “miners” that keep the network running. Those fees happen to be very high right now on the cryptocurrency (Ethereum) used for the ConstitutionDAO. So, many of the people who bought in will lose all of it:

And that’s the rub. About half of all people who contributed to ConstitutionDAO are in this exact same boat, according to ConstitutionDAO itself. Admins posted on Discord immediately following the auction that “we had 17,437 donors, with a median donation size of $206.26. A significant percentage of these donations came from wallets that were initialized for the first time.”

This means that about half of all people who donated to ConstitutionDAO are now going to either lose basically everything they put into Ethereum network fees or will have to become a supporter of an organization that tried to buy the Constitution, failed, and now essentially has no purpose.

Additionally, some are speculating that the core team may be profiting off the aftermath of the whole thing:

@ConstitutionDAO core team is either incompetent or malicious.

They’re making internal decisions that are causing insane volatility. The type that insiders could easily trade on.

This went from an interesting experiment to a complete mess very quickly.