if you can't fix it, it ain't broke

The Backstory

A few weeks ago, I was bemoaning the fact that my website URL was too long (, so I went on the search for a shorter (and more trendy ;) domain name. I found on namesilo for only a few dollars a year. Then I decided to use DigitalOcean to host the new website since it's only $5 a month and it provides a lot of flexibility for setting up web services.

As I was creating a droplet (that's what DigitalOcean calls their cloud virtual machines), I noticed a “Marketplace” tab with dozens of preconfigured options! After doing my reading on the ones that seemed interesting, I chose to go with Dokku because it advertised easy installation of separate web apps. And little did I know that I had found my new favorite software project!

As I started to build the site, I was amazed at the awesome features of Dokku. Deploying an app is really easy – just create some files, initialize them as a git repo, and push the repo to Dokku, which takes care of the rest. Each app is on a separate subdomain (e.g.,,, etc.), and Dokku manages each one, keeping track of the virtual hosts, docker containers, etc. behind the scenes. It even has a Let's Encrypt module to add https with only two commands!

I haven't been this impressed with a software project since I discovered that you can install almost anything in the Arch User Repository (AUR). Oh wait, turns out Dokku is in the AUR as well – a match made in heaven! Maybe I'll migrate to an Arch server in the future... or install it on Manjaro locally to easily test web apps.

The Update

The first thing I did was log in and update the system:

apt update
apt dist-upgrade
apt-get install -qq -y dokku herokuish sshcommand plugn

The Main Site

For the main site, I just copied my old site over and pushed it to Dokku. Most of the links don't work, and I plan to rework it in the future anyway (adding mobile support as well).

mkdir main-site
cd main-site
git init
git remote add dokku
cp /path/to/old-site/{index,header,footer}.php .
git add --all
git commit -m "importing php from old site"
git push dokku master

Let's Encrypt!

To enable HTTPS, I had to install a plugin, which is super easy and well documented:

ssh dokku plugin:install
ssh letsencrypt:cron-job --add #auto renew certs

Then I could set the “main-site” app's url to and enable HTTPS:

ssh domains:set main-site
ssh config:set --no-restart main-site DOKKU_LETSENCRYPT_EMAIL=my@email.address
ssh letsencrypt main-site

Messing Around

I added and removed some subdomains to get more familiar with Dokku. Here's the process for a subdomain at serving a static index.html page:

mkdir test1
cd test1
touch .static
nano index.html #add anything
git init
git remote add dokku
git add --all
git commit -m "test static site"
git push dokku master
ssh config:set --no-restart test1 DOKKU_LETSENCRYPT_EMAIL=my@email.address
ssh letsencrypt test1

Adding an SSH Key

At a certain point I wanted to switch to another local computer to continue working on the site, so I had to add another ssh key to Dokku. First, I generated the key:

[new computer] ~$ ssh-keygen -b 4096

Then I logged in as root from the old computer and added the public key to the root account by opening the file in nano and pasting the key as a new line:

[old computer] ~$ ssh
[] ~$ nano /root/.ssh/authorized_keys

Then I still had to add it to the dokku user, which stores it differently, with this command:

[new computer] ~$ cat ~/.ssh/ | ssh "sudo sshcommand acl-add dokku `hostname`"


After looking around for things that would run easily on Dokku that I could use to post content to my new website (wordpress, ghost, grav, etc.), I settled on WriteFreely since there was an awesome tutorial by Evan Walsh on how to set it up.

First I created a new directory and some config files:

mkdir blog
cd blog
cat <<EOF >Dockerfile
FROM writeas/writefreely

COPY config.ini .


CMD ["bin/writefreely"]

cat <<EOF >config.ini
hidden_host          = 
port                 = 8080
bind                 =
tls_cert_path        = 
tls_key_path         = 
templates_parent_dir = 
static_parent_dir    = 
pages_parent_dir     = 
keys_parent_dir      = 

type     = sqlite3
filename = db/writefreely.db
username = 
password = 
database = 
host     = localhost
port     = 3306

site_name         = blog
site_description  = 
host              =
theme             = write
disable_js        = false
webfonts          = true
single_user       = true
open_registration = false
min_username_len  = 3
max_blogs         = 3
federation        = true
public_stats      = true
private           = false
local_timeline    = true
user_invites      = user

These were mostly copied from the tutorial, but I changed the site's name, the site's URL, and I set it to a single user instance. Then I created the app:

ssh apps:create blog

And set up persistent storage to preserve the database and keys when rebuilding the app:

ssh mkdir -p /var/lib/dokku/data/storage/writefreely/{db,keys}
ssh chown -R bin:bin /var/lib/dokku/data/storage/writefreely/

ssh storage:mount blog /var/lib/dokku/data/storage/writefreely/keys:/go/keys
ssh storage:mount blog /var/lib/dokku/data/storage/writefreely/db:/go/db
ssh proxy:ports-set blog http:80:8080

Now it was time to push the app to Dokku:

git init
git add --all
git commit -m "init"
git remote add dokku
git push dokku master #this build fails

After that, the site was visible, but it displayed an internal error. Next I initialized the WriteFreely instance, and viewed the list of commands because I was curious how to manage users:

ssh run blog --help
ssh run blog --init-db
ssh run blog --gen-keys

With the app initialized, I rebuilt it and the internal error was replaced with an empty blog site:

ssh ps:rebuild blog

Since I set it up as a single user instance, I had to initialize an admin account to be able to log in (Of course I put a real password instead of just “password” :):

ssh run blog -create-admin johanv:password

Lastly, I enabled HTTPS (otherwise anyone could sniff my creds when logging in) and it worked without a hitch!

ssh config:set --no-restart blog DOKKU_LETSENCRYPT_EMAIL=my@email.address
ssh letsencrypt blog


So, that's how I got this site to its current state, thanks to DigitalOcean, WriteFreely, and most of all, Dokku. I have much migration from the old site to do, and many more subdomains planned. :)


Comprehensive Dokku Tutorial by Max Schmidt Let's Encrypt Cert for Main Domain WriteFreely for Dokku Permissions Issue in WriteFreely Adding a New SSH Key

Hello, World! I put together this list of cool Linux terminal commands that can be yours today, for the low price of FREE!


Get the weather.


Copy a command output to the clipboard.

cat file.txt | xclip -sel clip

Serve the current directory on port 8000 as a web server.

python -m http.server

(The old way was python -m SimpleHTTPServer, which is how it is in the screenshot)

Visit the web server at http://localhost:8000/ in your browser. Press Ctrl-C in the terminal to stop the server.

python -m SimpleHTTPServer A web server with one command! It can also be accessed by anyone on the same local network (house, school, library, etc.)

Measure the time it takes to run a command.

time find

Display a calendar.


Change the terminal to attack mode!

xtermcontrol –bg ‘#111111’; xtermcontrol –fg ‘#ff0000’

Terminal with Red Text Installing a python package in attack mode!

Re-run the last command as root.

sudo !!

Exit the terminal but leave all processes running.

disown -a && exit

Open a webpage in a text-based browser. Use the arrow keys to navigate, ENTER to click on links, and Shift+B to go back.



Set up a Virtual Private Network (VPN) on a remote server such as a DigitalOcean droplet. This will create a file /root/client.ovpn which tells other computers how to connect to the remote server.

user@local:~$ ssh root@remote

root@remote:~$ wget -O && sudo bash

Copy the client.ovpn file to the local machine.

user@local:~$ scp root@remote:/root/client.ovpn .

Import the remote openvpn server config into NetworkManager on Linux.

user@local:~$ nmcli connection import type openvpn file client.ovpn

Then use the network system tray icon to connect to the server.

Scan the local network an get a list of the devices, their IP addresses, and mac addresses. Replace “wlan0” with your network device, which you can find with “ip a”. The “tee” command saves the output to a file, while also displaying it to the terminal.

sudo arp-scan –localnet –interface=wlan0 | tee arp-scan.txt

Log in to a Raspberry Pi whose default password has not been changed. Replace the IP address with the actual IP address of the Pi. Let this serve as a warning: Be sure to change your Pi passwords so random folks don’t log in!

ssh pi@

Password: raspberry

Scan a computer on the network for open ports and other info.

sudo nmap -v

Forward local port 3337 to a remote server’s port 6379.

ssh -L 3337:localhost:6379 username@hostname

Set up a proxy on the local port 8000 through a remote server.

ssh -CND 8000 username@hostname

Set your web browser’s proxy settings to “localhost” and “8000” to act as if it was in the same local network as the server.


curl -s http://artscene.textfiles\.com/vt100/globe.vt | pv -L9600 -q

Big thanks to the internet, including but not limited to climagic and this youtube video.

My Linux Mint Setup

Linux is an operating system, comparable to Windows or MacOS. You can use it to browse the web, run applications, edit files, and all the normal tasks you use computers for. But Linux is fundamentally different from Windows and MacOS in several ways that I find very appealing.

This article covers my reasons for using the Linux, and some cool things you can do with it (such as a keyboard shortcut for an airhorn sound). Along the way, it has links to different tutorials and resources for learning more. If you have a question or a suggestion, don’t hesitate to leave a comment at the bottom of the article and I will be happy to respond.

Why I Love Linux

User Rights

The main reason I love Linux is that it respects the user’s rights. Linux is free and open source software, which means anyone can modify, distribute, and use the source code. Even people like me who are not well-versed in writing operating systems still benefit from the diversity that this creates.

Linux is not run by a single company, but a large number of organizations that maintain distributions, or “distros”. Some examples are Ubuntu, Linux Mint, ElementaryOS, Fedora, and Arch. Because of the separate distros, there is no single company trying to lock you into an ecosystem of services. If one distro tried to do that, people would stop using it and switch to a different one, or someone would create and distribute a copy of it without the restrictive aspects. There are no applications that cannot be removed (unlike Edge on Windows), and components of the system can even be uninstalled and replaced with alternate types to suit your needs. Different distros have different forms of these alternate components to appeal to audiences with specific interests.

Security and Privacy

Linux’s security comes from the fact that it is open source. This might seem counter-intuitive as anyone could examine the code for vulnerabilities. But, since there are more benevolent people examining the code than malicious ones, this has the demonstrated effect of bugs and security holes being found quicker on average than proprietary operating systems. Because it is open source, it is verifiable that no telemetry data is being sent back through the OS to a company to collect and track Linux users.

The actual level of security depends on the distro. There are some security focused distros such as QubesOS, which runs every application in a separate container to keep it isolated from other applications and personal data. Another security distro is Tails, which runs from a USB drive and resets every time you start up (for ultra-paranoid people, or anonymous journalists).

All this being said, no system is completely secure from a determined hacker or government, but Linux has shown itself to be the most secure.

Control of Updates

One of the most freeing things about Linux is that there are no forced updates! You can choose to update whenever you want, or never update at all (not recommended, but possible). You can using the system while it is being updated, and most updates do not require a restart. When updating, you can choose which updates you want, and you can downgrade each application later if you want to.

When a large update is released, such as a significant change to the layout of the desktop, there are usually a group of people who like the old layout better. On other operating systems, they would be out of luck. But on Linux, the programmers among them make a copy of the component (called a “fork”). They are able to maintain that fork and anyone is still able to use it and keep getting updates for it. The two versions then continue in parallel and most everyone is happy.


There are hundreds of Linux distros to choose from, dozens of which with a significant number of users. There are also many “desktop environments,” a component that determines the layout of the menus and apps on the desktop.

These are all Linux desktop environments, each with a different layout and workflow suited for different tasks and types of people:

GNOME GNOME – unique setup with a sidebar, and “activities” at the top-left corner

Pantheon Pantheon on ElementaryOS with Leos 7 icon pack – made to look like MacOS

Budgie Budgie on Solus Linux – clean and simple start-menu style interface

XFCE XFCE – lightweight, this particular setup has the menu on the top

MATE MATE on Fedora – fork of GNOME 2, menus on top and bottom in this setup

Cinnamon Cinnamon on Linux Mint – fork of GNOME, start-menu based (I use this one)

i3 i3 tiling window manager – for real hackers (my friend uses this one)

Settings Linux Mint Cinnamon Settings

Within each desktop environment, you can change the position of the menu(s), the theme, the position of buttons on the windows, and much more. Some desktop environments even have extensions that people can write, such as an extension I downloaded to make windows become transparent when being dragged so I can see the window underneath.

I have set up many keyboard shortcuts, ranging from silly sound effects played when I press Shift-F1, Shift-F2, etc (more on how to set this up later in the article!), to application launchers on Super-A (Arduino IDE), Super-B (Web Browser), Super-C (LibreOffice Calc), etc. I also set up shortcuts for moving windows around, like Alt-Left/Right to snap a window to one side of a screen, and Alt-<1-9> with the numberpad to move a window to a corner or edge of the screen.

Bootable USB

You can boot Linux from a USB drive! This is very useful for a variety of tasks. You can troubleshoot computers that won’t boot by booting from the USB drive and running diagnostics. You can remove passwords from Windows computers using a utility. You can retrieve files from any computer you forgot the password to (as long as it is not encrypted). If you accidentally formatted (erased) a hard drive, you may be able to recover it with a bootable Linux USB. It is also great for working with storage devices in general since Linux is compatible with all major file systems, and has some great easy-to-use tools for partitioning. I have put together a USB drive with multiple distros on it with software called MultiBootUSB.

Terminal Stuff

Nethack Nethack, a game that runs in the terminal

A terminal is an application that allows the user to type commands to interact with the system if different ways. Linux comes with a very diverse and useful set of terminal commands for just about anything. Basically, the terminal acts as the glue for the system, giving access to all utilities, and allowing you to write scripts that automate tasks like backup of files, changing desktop backgrounds and themes, or installing apps on a new system. One of my favorite scripts lets me swap between the default skin of Linux Mint and a Windows XP theme that someone made for Linux Mint!

Later in the article I will discuss some of the fun terminal apps you can run.


Linux uses very few system resources. Depending on the distro, it can use about 300 MB (0.3GB) to 800MB (0.8GB) of ram with no apps open, leaving the rest for all those browser tabs that somehow take up 250MB (0.25GB) each… By comparison, Windows 10 uses 1GB to 2GB of ram with no apps open. Linux also uses only a few GB of disk space, and boots very fast (again, depending on the distro).

This makes Linux perfect for…

Old Hardware

A lightweight distro such as Lubuntu or Debian can run on old hardware (or cheap hardware like a chromebook) and still receive security updates. You can finally turn that 10-year-old laptop into a portable emulator for the Atari 2600 (among many others)! This project took a computer from 1989 and put modern Linux on it, and it still gets updates.

Ease of Technical Use

I have tried to install python on Windows before, and it is not a good experience. Linux, on the other hand, has python already installed and even has multiple versions for compatibility with older python programs. Setting up custom networking with a system of servers, or even devices around the home is a lot easier and cheaper (no licences required) in Linux. If you want to set up an audio production machine, you can use the Ubuntu Studio distro, or install the programs it uses on any other distro to create your customized audio setup.

Home Server

While Linux only has 3% market share on personal computers, it dominates the server market, with about 2/3 of the world’s servers running some form of Linux. That means that you most likely use Linux without knowing it every time you use the internet! This makes it the ideal choice for a home server since there is so much high quality server software available for free. You can use Linux to host your own website, store a backup of your laptop, run a minecraft server, act as a DVR, stream music, control home automation, etc. Since most of the world’s servers run Linux, having experience with Linux servers is an important skill to have if you are going into IT or web development.

Cool Things to Do with Linux

Open a terminal in Linux (Ctrl-Alt-T on most systems) and type the following command to install some fun scripts:

apt install hollywood filters nyancat bb libaa-bin oneko toilet fortune lolcat figlet cowsay sl cmatrix

Then type some of these commands in for some surprises:

oneko (press Ctrl-C to exit)
cmatrix (press Ctrl-C to exit)
nyancat (press Ctrl-C to exit)
hollywood (press Ctrl-C twice, then Ctrl-D to quit)

Mystery Command extra bonus nachos if you can guess what command created this

See the appendix for the links where I found these cool commands.

Keyboard Soundboard

In Linux, you can map key pressed to sound effects! In Ubuntu, click on “Activities,” type “keyboard,” and click on “keyboard” under “settings.”

Step 1

Scroll to the bottom of the list and click on the wide “+” button.

Step 2

Fill in the fields as follows, replacing “johanv” with your username, then click on “Set Shortcut…” and press Shift-F1 (or whatever you want the key sequence to be).

Step 3

Download this sound effect and put it in your home directory.

Step 4

Press Shift-F1 and enjoy! You can add more sounds to the other Shift-F<1-12> keys using the same process. Here is a link to all the sound effects I added.


Thanks for reading (or skipping) all the way to the end! This has been my perspective on the world of Linux. Whether you find Linux appealing, appalling, or somewhere in between, I hope you got something useful out of this article. The appendix has some useful articles on learning more about Linux if you are interested. You can also leave a comment if you have any questions, suggestions, or… well… comments!


Here are some tutorials explaining more about Linux and how to use it:

Sources for cool things to do in Linux:

Screenshot of the Paper

I wrote an essay last semester at UMD about a proposed system for voting that would allow people to vote for a third party without wasting their votes. Voters would indicate their first, second, and third choices for candidates and the system would evaluate the choices so that if a voter’s first choice candidate did not win, the vote would be reassigned to the second choice, and the count would be re-evaluated.

[read the full essay]

Protonmail Inbox

Friends, Romans, Internet Users, lend me your screens.

I have known for a while that Google is one of the largest companies with most of us using their services daily. But recently I have realized the extent which they use those services to track you, and some of the negative impacts. One example of this is shown by a tool built by Carnegie Melon called AdFisher, which sends out “hundreds or thousands of automated Web browsers” to build up a profile of interests with ad-targeting networks. The tool found that fake users who were male job seekers were more likely than equivalent female job seekers to be shown ads for high-paying jobs. (Full Article: Another reason I switched is on the principle of supporting the “little guy” rather than super-large corporations.

So, I decided to start making small incremental steps away from Google’s services, the first of which being Gmail. My new email uses ProtonMail, which I set up a while ago but recently started using more frequently, then bought a custom domain and made the switch. (I still have my Gmail account set up to forward to the ProtonMail for people who still have my old email.) ProtonMail uses end-to-end encription so that no one can read your messages on their way to the recipient, not even ProtonMail itself! They also have apps for iPhone and Android.

You might think that the Google search engine might be the hardest to stop using, but I found an alternative called DuckDuckGo, “The search engine that doesn’t track you.” It is almost as good as Google at searches and there have only been a few instances where the results have missed the context and I had to add a few keywords. A small price to pay for Google knowing less about you per day.

Google Drive, Calendar, and Hangouts/Video Calls can be replaced with a service called NextCloud, which you can host yourself for free or pay for a company to host it for you. I am currently testing it on a Raspberry Pi to see if I like it, and so far it’s been great!

I currently have an Android phone, but I found a Linux-based privacy-focused phone that comes out in Jan 2019 made by Purism, a company that has made secure Linux Laptops in the past (

The last few services that will be hard or impossible to switch away from are Google Maps, Translate, YouTube, Google Groups (when joining a club, organization, etc.). I don’t see a problem with using a few Google services as long as Google doesn’t have access to all my emails, files, calendars, and searches.

UPDATE: A great alternative for Google Maps is OpenStreetMap, which has an app for Android and a custom website for iOS.

That’s all folks; thanks for reading. I’ll leave you with this limerick taken from my last post:

Johan’s become opposed to Google, The Internet kit and caboodle. He wants to stop being tracked, And get privacy back, But all of it’s just too dang useful.

Here are some limericks that I wrote for an assignment to tell my story.

Johan is one quarter Lebanese, And three quarters white as swiss cheese. He’s spent so long in MoCo, That he’s started to go loco, And he plans to take a trip overseas.

In 5th grade he became a Boy Scout, And liked to make fires and camp out. He advanced up in rank, Supportive family to thank, And got Eagle before the time ran out.

In High School he built many a robot, But never gave the plan enough forethought. They were piles of metal, Duct taped to a tea kettle, But they advanced to Worlds on a longshot.

Tinkering is Johan’s main token. From this there’s a proverb he’s spoken: For in work or in playing, He lives by the saying, If you can’t fix it, it ain’t broken.

When he was bored he played board games, In Dominion and Boggle he scored claims, But when railroads got gold studded, Monopoly got cold-blooded, And the friendships descended toward flames.

On February 14, what’s he doing? Not sending cards, giving candy, or wooing. He’s in his room with a CD, Reading a tutorial wiki, Installing Arch Linux on his PC.

Johan’s become opposed to Google, The Internet kit and caboodle. He wants to stop being tracked, And get privacy back, But all of it’s just too dang useful.

Now Johan’s a college freshman, Studying for a lofty profession. He’ll be a double E, Hitting the books with glee, Until he runs into crippling depression. (Just kidding :)

FTC Team 7393 Robot

This is a log of the FTC meetings at the electron Volts during the 2016-2017 season. Our website is at

#                                                               #
#                        Coder's Log.e()                        #
#                                                               #

An account follows of the myriad of adventures I have had with the electronVolts. My aim is that the narrative shall be as accurate as possible and will serve useful in reference during future events.

Saturday, October 1, 2016

We were visited by a band of rookies. They do not perceive the insurmountable tasks that lie ahead of them. I attempted to affright them by disclosing to them the monster that is The Code, but alas, they took an interest in this beast. I fear there is no way to warn them; their days ahead appear grim.

The Great Git attacked our code today. I researched its weaknesses in the Archives of Google and found individuals who were in a similar predicament. Armed with this knowledge, we were able to send it howling back from whence it came.

Sunday, October 2, 2016

I found it necessary today to journey into the desert of robot wiring. There are wires in every direction, extending out into the distant horizon. The shortage of water and software for three hours is starting to affect my sanity.

Tuesday, October 4, 2016

The wiring problem has been worsening. Connectors spew forth from every surface of the modules. Fortunately, I have discovered a solution. Unfortunately, the aforementioned solution requires an expedition into the jungle of printed circuit board design. The prospect of water makes the adventure more appealing.

This evening I spent a good while researching a mysterious artifact called the Chunk of Modularity. Legend has it that the Chunk can be constructed by connecting a set of modules in a vertical manner, with one large module running perpendicular to the rest. My first attempt at creating this enigmatic system was incomplete, but after a trip to the Amazon, I will finally have the components I need. The trip is scheduled to depart on the morrow and return within one fourth of a fortnight.

Wednesday, October 5, 2016

A portion of my crew sailed across the ocean to visit our backers today. They showed the backers the robots we have built. Whilst they were gone, I deemed it important to reorganize the software. As William once said, “Everything’s going swimmingly.”

Saturday, October 8, 2016

We are embarking on today’s journey with high hopes and a long trek ahead. The hardware team is scheduled to have some simple mechanisms built by the end of today.

As we reach the midpoint of our voyage, the hardware team is drawing out charts and diagrams.

During today’s expedition, the hardware team lagged behind and the rest of us had to wait for them. Typical.

There have been more developments on the Chunk of Modularity today. The trip to the Amazon has returned with some of the components. Now we plan to additively manufacture an enclosure for the chunk through the ancient ritual of “3D printing”.

Sunday, October 9, 2016

The printed circuit board design has been completed and now all that remains is to have it procured.

Tuesday, October 11, 2016

I sorted our collection of small engines, perceptive devices, and other curiosities. The rest of the team worked on building components of the robot’s hardware. We requested the printed circuit board to be constructed at the end of today’s gathering.

Wednesday, October 12, 2016

I have finally solved the servo inits, an issue that has been plaguing us since last year. They will be a bother to us no longer.

They have bothered their last bother. Their bothersomeness will have lasted the first botherer. You get it.

Headway is being made on the collector. We performed a test and recorded it with a device that is called a “Cam Ra”.

Saturday, October 15, 2016

Our shipment from Mr. Andy Mark arrived with the new gearboxes, which we secured to the test bot. Then we contrived a means of activating the beacons during the autonomous mode. Subsequently, a run of tests for the code was in order. The teleoperator mode is in fine condition. The task designation system and the operator option selection require more attention. I have succeeded in creating version one point oh of The Chunk of Modularity. The hardware team has done a quite excellent good job with the prototype collector. It performed very well at collecting particles at a rapid rate of speed.

Tuesday, October 18, 2016

Today’s effort was expended in recording the various and sundry functions of the code for other persons to research. The hardware team attempted to position the collector such that the robot shall fit into the standard space required.

Saturday, October 22, 2016

Disaster strikes!

My latest escapade was to wire the beacons together to be powered from one source. It became apparent that the wall adapter offered a supplementary four volts in addition to the twelve promised on the label. This unfortunate overabundance caused the beacons to become not unlike expensive bricks. I spent the remainder of the day repairing said bricks by replacing the innards with an Arduino device.

Tuesday, October 25, 2016

The unfortunate mishap involving the beacons has been mitigated. All the innards have been replaced and revitalized. The surplus meeting time was applied to the hardware efforts. Deadeye Mike lined up some perfect launches with the catapult. Unfortunately, none of them came to fruition.

Saturday, October 29, 2016

Today I showed to my apprentice Divya the mysterious process by which the code is modified. The hardware team busied themselves by improving the catapult to improve the consistency of their launches.

Tuesday, November 1, 2016

I coupled the line sensor array to the test robot.

Sunday, November 6, 2016

Divya and I activated the line sensor array. Then we tested the encoder boards and sent in an order for 500 to give to other teams.

Monday, November 7, 2016


Set up vuforia to feed frames to opencv

Calibrated the distance sensors

Tuesday, November 8, 2016

Wrote beacon color detection

Saturday, November 12, 2016

Removed the defunct distance sensor and calibrated the other distance sensor

Monday, November 14, 2016

Michael sent a motivational email

Tuesday, November 15, 2016

Tested the autonomous

Improved the vision processing

The line sensor broke

Wednesday, November 16

Tested line up — center of mass calculations are wrong

Saturday, November 19, 2016

Meet the field day:

Helped one team rotate the opencv frame

Second team had multiple dex files — started fresh

Team 3&4 were completely new to it and went through the whole process

Team meeting:

Fixed center of mass calculations

Fixed line sensor array

Tuesday, November 22, 2016

Tested the line up – doesn’t work that well

Wednesday, November 23, 2016

Attached the chunk

Friday, November 25, 2016

Met for 12 hours

Built shooter

William stayed the night and played Dominion

Saturday, November 26, 2016

Finished shooter

Built collector — has problems

Attached line sensor and phone case

Thursday, July 20, 2017

It has been quite some time since I last put into writing the various and sundry misadventures that have befallen me as a volt of electrons. I will preface by remarking that much has gone on that I fail to recall during that time. However, some of our exploits are as follows.

Gone are the glorious days of the Chunk of Modularity, the epic tales of Deadeye Mike, the frequent and costly expenditures to Mr. Andy Mark, who never rests. Those days of hope and expectation for successful ventures are gone, for we have brushed infinitesimally close to the line sensor threshold of success, but have fallen into the Integer.MIN_VALUE of failure. At the state tourney in Mary’s land, we were distraught at the insufficiency that was contained in one infernal machination known only as…


Darkness. A long pause. A point of light in the distance. It moves closer and closer. Could it be? No, certainly not. But as it approaches, it is unmistakeable. Yes, surely… We have our lives back. Our grades begin to improve. Free time becomes more than a concept. The servo inits are no longer a problem. And, more importantly, I am able to speak and write modern English properly.


We needed a break. While we were in the thick of it, we wanted to win, but looking back, going to Super-Regionals would have been more stressful. The new team members would not have the motivation that they do now to get there on their own if we had made it to Worlds. We wouldn’t have had the time needed to train people before the next season. Lastly, it reminded us that we value learning over winning, which we had forgotten while being so desperate to win.

After that, we found out about the 4-H Robotics Challenge, which takes place during the summer and uses a similar field to FTC. Since the teams are 2-4 people, we decided to split into three teams: Kelvin and Hobbes, Sherlock Ohms and Doctor WATTson, and the Crown Joules (which I am on).

I decided to work on a control system to use instead of the Modern Robotics system, since the other two teams would be using up the modules anyway. It uses an arduino on the robot which communicates with a Raspberry Pi on the driver station. After I started building it, FTC announced that they would be using the Rev Robotics Expansion Hub next season, so all my work on the system was unnecessary. I decided to use it anyway since I had already ordered the parts.

You might think that the FTC season was completely over at this point, and you would be technically right. But there was one more unofficial tournament, the Maryland Tech Invitational, that we signed up for. It was a two day event, with judging and qualifying matches on the first day, and the rest of the qualifying matches, finals, and awards on the second. Several companies had sponsored the event and provided cash prizes for various awards.

There were teams there who had gone to worlds, teams with amazing robots, and teams from New Hampshire, Iowa, and many other states who had all done very well. Then there was us. We hadn’t modified our robot since states, where we fixed the rollers after our last match. We realized from the start that we had no chance at winning, except maybe a small chance at the Sensor Fusion award, and we went just for fun.

I enjoyed talking to other teams about their robots, FTC, and robotics in general, especially the coaches of the Iowa team, the Cybots. We came up with an idea for an Arduino battery internal resistance sensor.

We did very well in the qualifying matches, and only lost 2, even though every match came very close. We ended up in 2nd place! Our first pick was Mechanical Paradox. When it came around to us again, our second pick, Gluten Free (from New Hampshire), was still available since we did our scouting well.

We recognized that we were the weak link in the alliance, so we ran the other two teams as much as possible. Mechanical Paradox had some hardware issues at one point, but they fixed it just in time for the match. We won the semi-finals against the 3rd seed alliance, but watching the scores other semi-finals made us anxious. They even had a tie and had to go to a 4th match!

In the finals, we and Mechanical Paradox ran first and lost. Then MP and GF won the second match. We were all nervous about the last match, and all eyes were fixed on Gluten Free’s robot as they autonomously… pressed the wrong color beacon!!! That was a big disappointment, and watching the numbers of shots, we weren’t exactly making up the difference in that department. Then end game rolls around and both teams pick up the large particles (as the announcer called them). Then the opposing team dropped the ball! Literally and figuratively! The gears turned on the field and in our brains trying to calculate our score based on the missed autonomous, the number of shots, and the dropped cap ball. It still didn’t seem like enough, when everyone looked down and saw that ALL the beacons were blue! We had definitely won the match! “We” meaning the teams we picked in alliance selection, anyway.

During the awards ceremony, while we were still trying to comprehend what had just happened in those last 10 seconds of the match, we were surprised to get the judges award! It came with a free Rev Expansion Hub, which was strange since we had just sent an extra one back in the mail a few weeks before.

There was a lot of luck involved, but two things (maybe the only two things) that were not luck were our scouting and our reliable autonomous. This tournament was a fantastic end to my last season of FTC.

And they all rode off into the sunset. [Fade to black.]

[The camera pans up from behind a table in the garage as team members are frantically trying to build their 4-H challenge robots. Various remarks are heard.]

“We said we would DESIGN it this time.”

“Man, we should have been working this hard 2 months ago.”

“I thought this 4-H thing would be easy!”

“Hey, pass the pizza. Do we have any pepperoni left?”

[Overhead rotating shot of people running around, grabbing parts, fastening bolts, fake-typing on keyboards, and the obligatory sparks flying from the grinding wheel.]

Narrator: Here we observe the robotics team in its natural habitat. Its diet consists of pizza, oreos, and, as it would seem, scrap metal. This amazing creature, while smart, is prone to procrastination. Little is known about how it manages to complete its tasks at the last possible minute, or how it turns stock metal into swiss cheese.

Narrator: And that’s all for now. Tune in next time where we dissect the inner workings of a dysfunctional bureaucratic government agency.

[Credits roll.]