First, a life update: I graduated from college, I’m working at VisioStack doing some interesting greenfield work, and I’m taking my first class from Harvard Extension School, hopefully en route to a degree in data science.
Signs & Seasons
My friend Elliot Lovegrove and I got back together for an ambitious project: A 4′ x 4′ painting on plexiglass with a network of ~80 NeoPixel lights inside the frame, powered by an Arduino Mega. It premiered at the Greenville Center for the Creative Arts on 8/2/19. I wrote a program to convert patterns of effects that run on the lights into Arduino-flavored C. That way Elliot could design everything and I could avoid messing everything up.
Here’s how the patterns work. An effect is some action (fading, twinkling, etc.) that happens to a subset of the lights. There are lots of effects and lots of options for each effect, which you can get a sense of at the link above. A stream is a consecutive set of effects, which happen in order and on repeat, forever. A stream’s modularity tells how many cycles a stream should go through to be active (e.g. with a modularity of 5 and length of 10 seconds, a stream would fire at times 0, 50, 100, etc.). A stream can also have an offset x to determine how long to wait before it runs the first time.
The formal way to say this is that the times when stream i begins are congruent to its offset x_i modulo (its length l_i times its modularity k_i). So each stream has its own little modular equation, and you can calculate how long it will take for everything to repeat using the Chinese Remainder Theorem. It’s a textbook case!
All streams run consecutively all the time. Two streams could potentially have effects that modify the same lights at the same time. If this happens, the conflicting colors are blended, unless the streams are on different layers, in which case the higher layer overrides the lower layer.
I don’t have a video of the painting right now; I was sort of hoping the gallery would put up a video, but if I get one through some other channel, I can add it here.
I started getting into chess last summer at the Clemson REU. It’s definitely grown on me! Although I remain objectively bad at it, I have more appreciation for how many different levels of suck are possible. Generally an ELO difference of 100 means that the better player will win or draw the other player most of the time. Since human blitz ratings go from 0 to ~3000, that means there are about 30 different levels of enlightenment to reach. I started out at about 700 a year a go – a number that’s phenomenally and embarrassingly low – and I gradually increased to about 1300 today. (I almost hit 1400 in July, though!)
The journey looked something like this:
From 700 to 900: Just playing a few hundred games online. 2 months.
From 900 to 1000: This happened while I wasn’t actually playing chess, rather four player chess, which I’ll discuss more below. Basically I played only 4-player chess for a few months, and when I returned, I had marginally improved my regular chess. 3 months.
From 1000 to 1100: There are a few common openings and a few reasonable responses to them. Using the analysis board to learn the openings to a depth of, like, two made a huge difference. 3 months.
From 1100 to 1200: I learned some basics about positional chess, like what constitutes a good pawn structure, two bishops good, etc. I read some of a beginner’s book on chess. 1200 is generally considered ‘standard’ chess noobishness, I think, and it’s about the 50th percentile of players on Chess.com. 3 months.
From 1200 to 1300: I did some tactics training on Chess.com and try to look for options (and my opponent’s response) when I make a move. 1 month.
My best rating is 1390, from July 2019, and the highest-rated player I’ve beaten is 1490, from August 2019.
As I said, I took a break last fall to play a lot of 4 player chess. I actually was much better at it than I am at regular chess – reaching a rating of 1550, where the max was about 1800 – and I wrote a bot for it as a senior project at BJU during the spring semester. The bot used TamperMonkey to play games on the live chess server. It had a standard game tree / evaluate structure, and I tuned some parameters using a genetic algorithms idea on AWS EC2. I’m happy that I got it to work, though (TBH) I wish that I’d put more time into it to try out new ideas. I thought that by making a personal project a formal requirement I’d have more incentive to put time into the project, but I actually experienced the opposite. That’s psychology for you!
On a related note, I’ve found it much easier to invest in projects at my job than I generally did on school projects. In fact, work often feels like my most engaged moments as a hobbyist. I’m not sure exactly why this is, but I’m grateful for it.
It’s been a while since the last update. Three notable miniatures, all from April:
‘BJU Blind Date’: With 24 hours to get a date to the last artist series, I launched a website to coordinate blind dates to the event. I got ~50 Facebook shares and 7 signups, including my date(s), which was cool.
Animal Moral Value: I interacted with this Slate Star Codex post as Tibbar. You can see what I did by checking the comments, but basically I try (and fail) reproducing the claims of the post by commissioning a couple large Mechanical Turk surveys. I spent about $200 and I surveyed ~500 respondents. My work generated not one but two followup posts from Scott, first a ‘partial retraction’ and then a retraction of the retraction when other people invalidated my study. It was pretty fun. Also, it was my first solo attempt at Mechanical Turk (perhaps explaining why my results were irreparably flawed!), which I learned about while tutoring UPenn’s Crowdsourcing Class – a steep learning experience, but very rewarding.
[Note – don’t visit the following link – it will lock up your computer.]
BJUCoin: For a senior math project, I created a simulation of cryptocurrency mining and had a live audience (~20 people) compete to create the longest fork and win the most mining rewards. Later my friend automated the mining process so there’s way too much data at that page (hence why I say don’t visit it). All the coding was done in 24 hours due to my procrastination, but it went off without a hitch!
I have a wishlist of ideas that I’d like to bring to life. It takes a lot of emotional currency to invest in a personal project. Most of the things I do happen over very short periods of time when boredom, time, and curiosity explode in a magical way. A review of my projects folder reveals that I’ve initiated over 50 projects since November 2017:
The x-axis gives folder creation date; the y-axis is in log-bytes, so a 3 is a kilobyte, a 6 is a megabyte, and a 9 is a gigabyte.
Caveats: This is not an exhaustive list of my projects (but almost so). For any given project, work might be missing (on another server, deleted, etc.). Also, for gigabyte- or even megabyte- sized projects, the material may be dominated by non-code (usually generated files, occasionally images.) Also, not all of these creation dates are accurate, unfortunately: I’m not sure why.
I would consider anything 5 and above to be a ‘meaty project’, with some 4’s possibly qualifying as well. Clearly it’s been a while since I got near an 8, but not all interesting projects need to be an 8.
Anyway, some upcoming ideas include:
- Calculating news bias with sentiment analysis and clustering of news topics. (This has been on the radar for nearly a year.) I’ve done some initial work on this in the past.
- Collecting data on my school’s graduates, allowing society rankings and interesting analyses on marriage rates, etc. I know that the results would be interesting, but there’s so much data to scrape. I’ve done some initial work on this as well (like 2%).
- Get reputation on StackOverflow by automatically identifying new error messages in popular open source projects (likely on GitHub) and proactively asking about and answering them, hopefully creating canonical responses.
- Can you influence what a pitcher throws by your pattern of swinging?
- Do batters do better against pitchers when they’ve seen a similar pitcher recently? / Can you arrange orders of pitchers in a way that’s most disorienting to batters?
- Chess – how does time/piece odds affect the relative ELO of players?
I’m leaning towards the baseball projects, largely because it’s been so long since I did one. I’d like to get something together before next summer’s conference cycle. I’m definitely still interested in breaking into that world.
This should cover things for the next few months!