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

This is copied from my journal that I kept during Bridge DC in summer 2019. More info about Bridge DC.

I thought I heard my name called in the babbling crowd, but it was just an echo. I thought I saw my face reflected in the shifting mass, but it was just an illusion. I thought I sensed my purpose in the wavering sea, but it was just a manifesto.

I took a pause to listen and be still, Away from the voices pulling me every direction but upward. But I hear the music playing, empty of purpose, demanding my attention, distracting my mind from listening. The music, being temporary, fades away, and the listening continues, taking its time.

Look back and see the memories to be grateful for, and the mistakes to be learned from. Look around and feel the peace to rest in, and the lingering tension to resolve. Look forward and envision the dreams to follow, and the suffering to endure with joy.


Build a schedule with Courseoff, find ratings on classes and professors on PlanetTerp, and see what requirements you have left on Degree Audit. Talk to your advisor, but also check what they tell you with more experienced people in your major. Once you have decided what classes you will take, make sure you have no registration blocks at Appointment and Registration Status and register for them using Registration Drop/Add. Use a spreadsheet to keep track of your 4-year plan, and make sure it lines up with the PDF your advisor emails you.


This is a guide on how to use various tools to register for classes at the University of Maryland, College Park (UMD). It is written by me, and although I'm a computer engineering major, I wrote it in a way that it should be useful for people of any major. Also, I am in Gemstone, so I have included some info on Gemstone classes here too.

This guide is based on my experience and advice people have given me. If you have anything to add, contact me and I will add it to this blog post. It was last updated on November 5, 2019.

1-Semester Planning

Testudo Schedule of Classes What is it: This is the official UMD list of classes, where you can look up a class or requirement and see the professors, sections, days and times, prerequisites, requirements it satisfies, how many seats are available (updates once a day), etc. Useful for: finding which professors are available for a class, which sections are still open, which classes fulfill a particular requirement Tips & Tricks: You can click on a GenEd requirement to see all the classes that fulfill that requirement. You can also search for part of a class name, for example searching “CMSC1” will give you all the 100 level CS classes. Testudo Schedule of Classes

PlanetTerp What is it: A site made by UMD students/alums that gives info about and ratings for each class and professor. You can see the grade distributions and which professors have the highest ratings for a particular class. Useful for: Deciding which classes to take so that you don't end up with all you classes having a hard grade distribution, deciding which professor to take for a given class (although you should confirm with people in higher years in your major just to make sure). Tips & Tricks: There is a “View on Testudo” button which sends you to the Testudo Schedule of Classes (described above). This is useful for finding which sections are open once you find a class on PlanetTerp. PlanetTerp Side note: I would definitely recommend HONR218T as a good GenEd — you get to go to DC and see some plays!

RateMyProfessors What is it: A 3rd-party (not made by UMD) tool to find other students' ratings of professors. Useful for: It is not as useful as PlanetTerp, but if a professor isn't rated on PlanetTerp, you can check this site. Tips & Tricks: The site keeps track of the same professor as they move to different schools. RateMyProfessors

Venus What is it: UMD's official schedule builder tool. It auto-generates multiple options based on the classes you input, and several options such as desired start time in the morning. Useful for: Finding a schedule based on the classes you want to take. Tips & Tricks: If you get frustrated with Venus, use Courseoff instead. :) Venus

Courseoff What is it: A 3rd-party class schedule builder tool. You select the classes you want, and it shows you all the sections for each class, which professor teaches each section, and how many seats are open for each. Then you can select the section you want and it will show it on a calendar. You do this for all you classes to make sure that your schedule works, swapping out sections where desired. Useful for: Manually creating a schedule that fits your needs without having to specify requirements like you do on Venus. Tips & Tricks: You can also create multiple alternate schedules to compare them, or as a backup plan in case you don't get the section you want when you go to register later. Courseoff

Degree Audit What is it: An official UMD tool to run through your degree program and find what requirements you have completed, which ones are in progress, and which ones you still have to take in future semesters. Useful for: Seeing if you are on track for graduation in time, seeing what requirements you need to fulfill next, calculating how many credits you need to take per semester. Tips & Tricks: You can click on “Major,” “Gen Education,” or “Gen Elective” to see the results only for that category of your audit. DegreeAudit

Appointment and Registration Status What is it: A simple tool to view your class registration status. It will list any “registration blocks,” which are things that are keeping you from registering for classes. The most common one is your meeting with your advisor. Useful for: Finding your advising deadline, finding your class registration date and time Tips & Tricks: Make sure to register as soon as possible after your allowed registration date. You will register using the Drop/Add tool (see next). Appointment and Registration Status

Registration Drop/Add What is it: The tool to actually register for a class (or drop a class). Useful for: Registering for classes! Also seeing if a class is full (see below). Tips & Tricks: Since Testudo Schedule of Classes only updates once a day, you can use Add/Drop to determine if a class is full. Just try registering for it and it will fail if full and succeed if not full. You can then drop the class if you didn't actually want to register for it. Also, if you aren't 100% sure of your schedule on your registration day, just register anyway and you can drop some and add some later. Registration Drop/Add

4-Year Planning

PDF from Your Advisor

What is it: After you meet with your advisor, they will email you a PDF with your current 4-year plan. The classes you are registering for next semester will be highlighted in yellow. Useful for: Seeing your overall plan, when you will graduate, what requirements you have completed and what you still have left, which classes your advisor thinks you will be taking (make sure that it is correct!) Tips & Tricks: You'll want to save these PDFs that you receive to a folder somewhere so you don't lose them. PDF from Your Advisor

Plain-old Spreadsheet

What is it: A basic spreadsheet that you can edit to keep track of how you will fulfill all the requirements and graduate! You can use Libreoffice (, a free and open source office suite. Of course any spreadsheet software will work fine, but I like to use and support open source stuff where possible. Useful for: Trying out different 4-year plans, making sure you'll complete all the right GenEds, Tips & Tricks: The organization scheme I use is a set of columns (class, credits, requirements, etc.) for each semester, with 1 row for each class. Here's a screenshot: Plain Old Spreadsheet Note that I have color-coded some items blue to note that I have a future class planned to fulfill that GenEd. For example, some of the later Gemstone classes will fulfill several GenEd requirements. Make sure you don't register for extra GenEds that will be completed later!

That was a lot of info! I hope you took the time to read through it and found it useful. If you have any questions, or suggestions on something to add to this post, feel free to contact me. Good luck registering!

tl;dr (short version)

Bridge is a 7-week immersive justice program including an internship (I taught tech classes at Year Up). I learned that serving people can also mean using the gifts God gave me, and doesn't have to be measured in a certain way. I identified some areas where I am self-righteous and became more conscious of what it means to truly love people and not just love part of them. I also realized I joke around too much when discussing serious topics, and I began to be more conscious of how my words affect people. I saw examples from community members and guest speakers of how the Kingdom of God is lived out. I came to a new understanding that loving God, loving your neighbor, and loving yourself are all interconnected and mutually necessary.

Team Photo

What is Bridge DC?

Bridge DC is a justice program run by the InterVarsity (IV) Christian Fellowship where students such as myself go to Anacostia, DC for 7 weeks of learning, discussing, and experiencing the issues that affect DC and how God is working in the city. As part of the program, students are paired with a volunteer internship site — mine was a teaching assistant position at Year Up, which aims to close the opportunity divide by partnering with companies looking for new employees and with young adults who can't afford college and are looking for a job. They teach business and technology classes in a 1-year program, after which the students receive an internship from one of the companies. I attended the program from June 13 to August 1, 2019 and learned a lot! The following are some of the areas of growth that I have reflected on.

Expanded Vision of Service

At DC Plunge, a 1-week spring break trip with similar DNA to Bridge DC, I learned that service is not limited to physical service, but also includes relational service. Some examples are stopping to talk to a person who's homeless, visiting people in prison, being friendly to new neighbors and offering to support them if they need anything. Acts of relational service acknowledge the dignity in a person as a child of God and as a sibling in humanity.

As an introvert, I have a lot of trouble breaking the ice in conversations, and sometimes struggle with knowing what to say, so relational service (as defined above) is difficult for me. What I learned at Bridge is that service can take on other forms, and it can include things I am good at as an individual! A few mornings during the summer, I went to Our Daily Bread, which is a soup kitchen hosted in the basement of a Methodist church. Volunteers not only serve food, but also eat the same food themselves and stick around to talk. It's grown over the years into a supportive community for people who fall on hard times. (One day they even had a doctor come in and do check-ups for free for whoever needed them!)

One morning, I saw someone playing a piano that was over where I hadn't noticed it before, and I went over and asked if I could play when they were done. At the time, I felt like I was running away and avoiding talking to the people, but after I played, folks thanked me for playing and said that it brightened their day! It was a simple event, but it started a shift in mindset that service didn't have to mean doing things I'm bad at, but it could involve using the gifts God gave me to bring joy to people.

A few weeks later, St. Teresa of Avila Catholic Church, which we were attending for the summer, invited me to play the piano for their prelude, and the choir director told me afterward that I should find some outlet, such as a senior home, to play for people who don't get many visitors. Another example of relational service involving things I am skilled at and love doing!

Another thing I did this summer was an internship at Year Up, which teaches technology to people who can't afford college. I was a TA, doing grading and teaching a few lessons. Most days though, there was not much to do except hang around and answer questions that people had. Some people asked me questions about Linux or web servers, which I know a lot about and was able to point them to the right online resources. For example, one guy was creating a website for his friend's business. This is another example of how the pre-defined expectations I had for how I would serve (teaching curriculum, grading papers, etc.) were subverted and the more important thing was spending time with the students to answer questions.

To summarize, my understanding of service broadened: Before, it was just things like feeding people who need food or talking to people who most people pass by. After, it expanded to also include using the gifts God gave me, like playing piano for people or giving advice to someone about how to set up a website.


What is self-righteousness? In the past, I would have described it as “Feeling better than other people because you think you are inherently more right or moral than them.” (I also didn't view myself as self-righteous.) But it has a way of creeping in to my thinking, and this summer I learned another helpful angle to identify self-righteousness in myself: feeling the need to prove that I am justified.

Needing to prove one's self comes from the creation of an “in-group” and an “out-group.” Wanting to be part of the in-group, I realized I was trying to emulate characteristics of someone who cares about justice rather than being OK with looking dumb and focusing on the learning that Jesus is calling me into. I didn't consciously create the in/out groups, and in fact I disliked the us/them mentality. But, subconsciously I put people in the out-group if they were not accepting, not open, had an us/them mindset, etc. In this way, I had turned into exactly the thing I was trying to dissociate from!

Another thing that tipped me off is that I have a problem learning from people when what they're saying makes me feel dumb. On several occasions (see the next section), I said something to offend someone, and it was difficult to admit that I made a mistake and hurt them as a result of my ignorance. (Thank God we were in a house committed to conflict resolution — we got through it!) It was even harder to listen to the person I hurt and accept advice and suggestions for change. It was also hard for me, and still is, to bring up controversial topics such as politics and religion, because I sometimes react badly to disagreement and conflict. As a result of avoiding having the hard conversations, I tend to build up a perception of someone's opinion or what they think of me in my head, which upon talking to them is completely overblown.

I'm still working on dismantling my self-righteousness that has built up unconsciously, and on being able to learn when I feel dumb or attacked. But because of Bridge, at least I am more aware of these characteristics of myself that are not so great, and not ashamed to admit my weaknesses and process them.

Joking on Serious Topics

My sense of humor has always been a way to bond with friends and family. I think I got it from my Dad (who tells some sick dad jokes), and his Dad (who knows some sick limericks that I was inspired by). I also liked to joke around on my high-school robotics team and generally have a good time. Coming to Bridge, however, I realized that I use joking as a coping mechanism for dealing with serious topics.

They say humor is all about timing, well, serious topics are definitely the wrong time to make a joke or jab at someone because they might be processing it in a different way. I ended up making some jokes that were hurtful to people and since our house was committed to growth and openness, I was called out (1-on-1, not in front of everyone thankfully). A verse from the Bible that has been relevant to this is James 3:1-12, which talks about how the tongue is a powerful part of the body for good or evil, and “Out of the same mouth come praise and cursing.”

As I started to become more aware of my insensitive joking, I had to make the choice to continue to bring my whole self to the table, which was necessary if I wanted to deal with deep-seated issues that involved my whole self. I have become a lot more aware of how the things I say affect people, and I have gotten a little better at holding back and considering things more before I say them.

The Kingdom of God

This summer, I read “Irresistible Revolution” by Shane Claiborne, which my grandpa lent me before I went on the trip. It's a collection of life stories from the author, for example, one time there was an abandoned cathedral in Philadelphia that homeless people were staying in while they waited for their applications for housing to go through (It had been months or years for some). The city wanted to kick them out, but a group of college kids occupied the cathedral and made it a media spectacle so that the city was afraid to kick them out and look bad. Multiple different groups got involved and helped out in different ways, and each time the city would try to kick the homeless people out, God would provide in some way to protect them. The book has a lot more stories like these, illustrating what happens when you follow Jesus in radical ways, living out the Kingdom of God with communities that are neglected. One cool idea from the book is that instead of just serving people in need, we should make friends with them and build community together. After all, Jesus was homeless, staying in other people's homes or in the wilderness while he traveled around healing the sick and ministering to the people. This book was really inspirational to me and changed how I think about faith in more of an active mindset. (If you want to borrow the book, contact me and I'd be happy to lend it to you if you are in the area, or I can send it by mail).

During the trip, we heard from many guest speakers who were also living out their faith in Jesus and the Kingdom of God. Dawnielle discussed different types of prayer that are common in different church backgrounds and how we can learn from other denominations. Michael Howard talked to us about the fact that we only know the tip of the iceberg when we know someone and there are good and bad things about everyone. Father East told us about the history of St. Teresa of Avila, the Anacostia area, and some general church history. Branden Polk covered many topics: spending time with people you disagree with to move towards reconciliation; ignorance or pain leads to fear, hyper-vigilance, and control, while curiosity and awe lead to learning, growth, and collaboration. Kathy and Don chronicled their wild adventure in taking on multiple foster kids, and prayed for some of us individually. Pastor Lisa drew up a framework for incarnational ministry — a full picture of the Gospel including proclamation of the word and demonstration of compassion, but also restoration and development (e.g. helping establish grocery stores in food deserts) and confrontation of injustice (e.g. petitioning congress). It was great to hear and see concrete examples of how to live life differently, getting messy and involved on the practical level, and serving the Kingdom of God.

Loving God, Neighbor, and Self

This is a small, but important revelation that I had during a Bible study on the story of the good Samaritan. My mindset beforehand was that loving other people was a bit of a one-way thing, but rewarding because it's the right thing to do. However, the command in that story is not to love others and neglect yourself, but “Love the Lord your God with all your heart and with all your soul and with all your strength and with all your mind; and, Love your neighbor as yourself.” Loving God and yourself are also part of this command, and what I realized is that it is hard to love your neighbor if you don't love yourself, and vice versa. And if you don't put loving God first, you will not be rooted well and will not have the strength to support others.

What Now?

  • Continue to use the gifts God gave me for service
  • Be conscious of my urge to prove myself
  • Be mindful of how my words affect people
  • In service to others, don't neglect to love God and myself
  • Explore the intersections of Jesus, Justice, and Tech through a bi-weekly dialogue on my college campus (blog post coming soon!)

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.]