Thursday, September 25, 2014

Friday, May 11, 2012

Set volume to 1 on OS X

I just discovered an easy way to set the system volume to the lowest value greater than 0. Use the Volume Down button to reduce the volume to 0, then hit the Mute button to increase it to 1. It's a shame that I'm the only person in the world who needs this feature; my earbuds are just too loud.

Monday, April 30, 2012

Corporate activism is the new activism

The US political system is broken. Everyone agrees on that. For an explanation, see This American Life's recent episode on campaign finance. Politicians must fund their campaigns by asking lobbyists for money. In return, lobbyists ask politicians for face time to explain their corporation's interests. Not some politicians; all politicians. Unless there's a public outcry, the interests of the citizens are outweighed by the interests of the paying corporations.

The most idealistic among us think that we can change this with grassroots activism. They believe that the internet will allow the people of the US to band together and make our politicians accountable again.

I don't buy this argument. People simply don't have time to care about most of the issues that affect them. Activism is a full-time job. That's why we have a representative democracy. We elect politicians to represent our interests in the lawmaking process.

Thus, I propose a "new" form of activism effective in today's political environment: corporate activism. Instead of trying to convince people to donate their time and money to a cause, construct a business whose interests align with your cause.

If your goal were to reform copyright law, you could create a business that would benefit from shorter term of copyright. For example, Netflix for public domain movies. If you want to eliminate software patents, build a software company which doesn't create or buy any patents. Your company would be certain to infringe on thousands of software patents, so it would be incentivized to lobby for patent reform.

The difficulty in creating your own activist corporation lies in keeping the company's interests aligned with your cause. Netflix could have been an advocate for sane copyright law, but now its deals with content companies form a barrier to entry which protects its business. Netflix would face increased competition were the US term of copyright to shorten or the penalties of copyright infringement to lessen, so it has no incentive to advocate copyright reform. Likewise Google could have been an advocate for net neutrality, but it struck a deal with Verizon, an opponent of net neutrality, to convince Verizon to carry Android phones.

Despite the risks, I see corporate activism as the most effective way to change the US political system today. This isn't how it should work, but campaign finance has been fixed, there are no reasonable alternatives.

Wednesday, January 4, 2012

A perfect life

A recent conversation about the future prompted me to reconsider my definition of success. I still want to create a product that improves the lives of millions of people and earns me millions. However, I don't need that level of success to support my ideal lifestyle. I require only four things:

Wife and kids
My life won't be complete without a mate to share my life with and children to teach and learn from.
Work I love
I need to spend my working hours doing something I enjoy for a purpose I believe in. Doing otherwise would be a waste of my precious time.
Three day work week
My wife and I need to be able to support our family's lifestyle working only 8 hours per day three days per week. That way, at least one of us will be home with the children every day. Until all of my children enter school, I want to spend more than half of my time with them. There's no more valuable gift I can give my children than my time and attention.
Ability to relocate
I want to move my family to a new area every two years. My own family's frequent relocations gave me a broader perspective on life and helped me develop my independence. I want to bestow the same benefits on my children. Also, I love to live in new places.
No commute
I refuse to waste hours of my life every week driving or riding to an office. Either I'll work close to home or I'll work at home.

I was surprised when I realized that this was all I needed from my life. I feel like I have more freedom in constructing my life than I had.

Thursday, December 15, 2011

Learning to think and learning to do

All knowledge falls into one of two categories: practical and theoretical. The key to a successful career in computer science is balancing your interest in both.

Theoretical knowledge

I consider any topic which is independent of a specific programming language or platform to be theoretical knowledge. Theoretical knowledge encompasses abstract CS topics, such as data structures and algorithms; the underlying mathematical concepts, such as graph theory, combinatorics, and automata; and the hard problems of CS, such as computer vision, artificial intelligence, etc. These are powerful tools for solving hard problems and building things which haven't been possible before.

However, becoming an expert on a theoretical topic won't get you any closer to building a successful iOS app or web service. Without practical knowledge, you'll be dependent on your partner, team, or organization to allow you to accomplish your goals. You won't be able to implement your ideas on your own.

Practical knowledge

Practical knowledge is the stuff you need to know to bring your idea to the world. It's the connection between abstract ideas and useful products. Practical knowledge includes programming languages, APIs, applications, etc. Mastery of a few practical topics allows you to quickly build something which others can touch and use. Practical knowledge also brings independence: you can start a business if you have something to sell.

However, practical knowledge isn't enough to change the world or even make a competent programmer. Without theoretical knowledge, you will waste time reinventing algorithms and trying to solve impossible problems. In addition, your plans will be bounded by the extent of your theoretical knowledge.

In practice, it's impossible to work in Computer Science or programming without some knowledge from the opposite field. Nevertheless, you can't reach your potential in either field without seeking a balance theoretical and practical knowledge.

Friday, November 11, 2011

Landing the perfect research internship

If you're considering grad school (and you should), you owe it to yourself to experience research for yourself before you make a decision. Spend a summer working on a research project at a university, and you'll know whether research is for you. Below, I share my advice for finding and landing your ideal research internship.

1. Find your internship

The first step to getting the perfect internship is finding the perfect internship for you. You need to consider things like location, pay, required skills. Pick at most ten internships to pursue further; if you apply for many internships, you won't have the time to form relationships with your potential researchers.
One great place to find research internships is the National Science Foundation. They fund REU (research experience for undergraduates) programs at schools across the country. You can find a list of participating schools on their website. Here's a list of organizations offering undergraduate research opportunities. Some universities offer independent research internships which they fund themselves. If you have a particular university in mind, try exploring their website to see if they offer independent internships.

2. Research the positions

This is the most important step in the process: learning about the positions. For each position, you must determine whether you want it and whether you're qualified to fill it.
First, sift through all the research opportunities available through each internship and find some which interest you (or don't bore you). This is difficult because you don't know enough about the research domain to make an informed decision. Keep cutting until you're left with a group of projects you can see yourself working on.
Second, read some research papers about the projects in which you're interested. Projects' websites rarely have the information you'll need to make your decision. You need to determine whether you're still interested in the project and whether you have the skills necessary to contribute to it. This process also gives you more information about the researchers.

3. Make contact

Before you even write your application, you should start a conversation with the researchers you're hoping to work for. Establishing a connection before the application process is the best way to improve your chances.
Contacting a researcher at a large university directly, however, can be a challenge. Sending an email is like playing the lottery: the odds are good that you will never receive a response. You can increase your chances by contacting the researcher's grad students, secretary, or postdoc students first. Other possible approaches are calling the researcher and sending them a letter. The keys to success are creativity and persistence.
Protip: If your researcher has a postdoctorate student, contact them first. They have more time than the researcher or their graduate students.
Your first email must be "perfect": free of spelling, grammatical, and cultural errors. The goal of this email is to give the recipient a reason to reply and give them no excuse to ignore it. It must be as short as possible, conveying only the core of your message. Exclude flattery, greetings, and anything else that isn't vital to your message. Don't attach your résumé; that's disrespectful of your recipient's time.
You have several options for the content of your message. You could ask a question about a project or ask whether the researcher is looking for a summer research intern. You may include some brief statement of qualification if it's relevant, but it's not necessary.
Below is the first message that I sent to Dr. Roy Campbell, my researcher for my internship at the University of Illinois at Urbana-Champaign:
Subject: ITI Undergraduate Internship question
I'm planning to apply for the ITI Undergraduate Internship program, and my first task is finding the professors with whom I would like to work. If I were to spend the summer working with you on your research, what would I be doing? I'm particularly interested in your research on p2p distributed operating systems and ubiquitous computing. Would I be able to choose my topic of research? Thanks for the help.
It has twice the lines that it should have, and it contains two dumb questions. However, it demonstrates my communication skills gives him a reason to respond. In that respect, it does its job.

4. Do the work

Once a researcher has responded to one of your messages, start reading everything you can find about their research and the surrounding field, starting from the most recent. Pick a interesting project from each researcher, but don't become attached to it. The more knowledgeable you are about a researcher's work, the more professional and motivated you'll sound to them. Plus, it's good practice for your internship.

5. Write your application

Writing an application is probably the least important step in the application process. However, it's also the step most likely to keep you from an internship. Your application must be "perfect" in the same sense as your first message, but it need not be a literary achievement. It should tell the reviewer why you would be a productive research intern. Anything irrelevant to that goal should be excluded.
Protip: Don't list "communication" or "writing" as one of your skills. If you can write, it will show in your application.

6. Follow up

If the website for your internship program doesn't mention a decision date, plan to contact the program administrator two or three weeks after the application deadline to ask about the status of your application. This step has two purposes. First, it helps you learn the decision on your application sooner. Second, it keeps the process moving. Without supervision, the application process could stall for months.


A research internship is a great way to learn about research and the grad school experience. They key to landing one for yourself is finding the right one and connecting with your potential researcher. Good luck!

Monday, September 26, 2011

My Summer Internship

Last summer, I researched cloud network security through an internship with the Information Trust Institute at the University of Illinois at Urbana-Champaign. It was the best summer I've ever had.

First, it was exhilarating and terrifying to move to a new city with only the things I could carry on a plane. I spent my first weekend in Urbana acquiring the things I needed to live: food, towels, toiletries, and a bicycle. Once I had settled in, I found Urbana-Champaign to be a wonderful place to live. When I spent time exploring the city, it rewarded with delicious restaurants, fascinating architecture, and stimulating culture. Exposure to Black Dog's barbeque pork sandwiches and brisket burnt ends and Murphy's Pub's hamburgers has destroyed my appetite for the substandard barbeque and burgers I've found here. Every day I wish I were back in Urbana.

Second, I enjoyed working on something substantial. My job was to research computer network security, devise a new network security system, build a prototype, and document the work. The research time gave me an excuse to learn how networks work. The planning stage introduced me to the process of brainstorming and planning with a team. In the prototyping phase, John and I managed to assemble a test network with 32 virtual machines, build two prototype security enforcers, and test our prototypes on the test network. To document our work, we created two posters and wrote a research paper which will be published by the International Workshop on Resilience Assessment of Complex Systems 2011. I'm proud of what I accomplished during the summer.

Third, I was honored and delighted to befriend my colleagues and fellow interns. It was a thrill to work closely with John, my partner on the project. We spent hours together slinging code, debugging the test bed, and writing posters and papers. I also enjoyed eating lunch with the other ITI interns Tuesdays and Thursdays at the internship seminars. On the weekends, my posse and I would meet to go bowling or eat dinner. We also had a few events at Europa House for all the summer iterns: a Walking Dead marathon, movie nights, and potlucks. The things I miss most about last summer are the friends I made. However, I expect to meet them again in the coming years on the cutting edge of industry and computer science research.

In summary, my summer internship at UIUC allowed me to live in a new city, research cutting-edge technology, and make new friends. Next summer will be even better.