Focus List

I’m heavy user of to-do apps, specially Wunderlist, but recently my to-do list started to be a place I dread looking at it. I have too many lists, overdue tasks, things that I need to work on today, things that I need to take care of a week from now, groceries shopping lists, and a plethora of other things.

Simply it was just too distracting for me. Just like the 1000+ unread messages in your inbox right now that makes it impossible to read a message without being distracted by all that noise.

My primitive solution to the problem was to grab a piece of paper everyday, write only the important tasks that I need to focus on today, and ignore the rest of my to-do list for the rest of the day. By the end of the day, I throw away that piece of paper and start the next day with a fresh set of tasks. That approach worked quite well for me, so naturally the next thing for me to do as a software engineer was to turn it into an app.

Focus List does just that. It’s a very minimal to-do list with only a place for tasks you need to focus on today. The list is wiped out clean by the end of the day so you always start with a clean slate next day in the morning (or whenever you tend to start your workday).

Even though Focus List is very simple, I’ve been working on it for quite some time now. Since my goal wasn’t just to ship it, but rather to do some experiments in both the UI and the code along the way, I’ve changed the UI a couple of times and rewritten the majority of the code every time.


Download from the App Store

Focus List is available on the App Store for free with no ads or in-app purchases. Go grab it now, and I hope it helps you be more productive.

Side Projects

At any given moment I’m always working on a little side project. Some times they ship, usually they don’t (I only have TracKit and Photos Cleaner on the App Store, and one more app in review as of this writing).

Usually when I start telling people about the side projects that I’m working on, they wonder why am I wasting my time on projects that I have no interest in monetizing or that might not even ship. I have a very good reason.

Stupid side projects are always a healthy thing to do. You don’t expect any of your side projects to be the next Facebook or Twitter, or to change the world, but you keep on building them anyway. You build them because they are things you personally need. You build them for education, either about a certain technology or a certain aspect of business.

Since I’m usually not expecting to make money out of my side projects, I skip the market validation part and jump right into building them. That sometimes means sketching it on a piece of paper to make it clearer for myself, or on other occasions it means starting to code right away.

In side projects I get to be as meticulous as I want. I have no deadlines so I get to do things the way I see best, which occasionally means completely scrapping some parts and rebuilding them, and that is always great for learning. I also get to try whatever new crazy technology or language that looks cool but is too crazy to use in my full-time job.

It would be great if a side project turned into something that makes a decent amount of money, but that’s never the intention when I’m working on them, and that’s what makes them very special. I’ve learned a lot working on side projects, and I’ll continue to do it for as long as I have the time.

What stupid (or not so stupid) side project have you recently worked on?

Photos Cleaner 1.0

I have a ton of screenshots cluttering my iPhone Photos library. When I finally decided to clean it up, I downloaded a handful of apps that let you do that but I didn’t like any of them, so I decided to build my own (because that’s what programmers do, right?).

The result is Photos Cleaner. Created during a few spare hours on a weekend at a Starbucks, this is admittedly not the toughest app I have worked on, so I’m making it available for free.


Download from the App Store

Personal Core Values

Great companies define a set of core values that they live by. These core values help keep everyone aligned to what the company believes in and form a healthy culture.

A while ago, I went through the exercise of helping define core values for the company I worked at. It inspired me to come up with a similar list of personal core values to live by. This list has been very helpful to me day-to-day and especially helpful whenever I need to take a major life decision. I occasionally look at my list of core values and see if what I’m currently doing with my life, or that major decision I’m about to take matches with those values.

I’m constantly tweaking this set of core values to better reflect what I would like to do with my life. Here’s my current list:

  1. Passion is not optional. Being passionate about whatever you are doing is the most important thing. Everything else is secondary.
  2. Leave your comfort zone from time to time. Doing so is critical for the creative process to thrive.
  3. Embrace change. Don’t live in fear of the new. Embrace change. Embrace diversity of opinion and always be open to new experiences.
  4. Accept different people. Accept people who think in ways that are different from you, and people of different religions, cultures, and races.
  5. Embrace simplicity and minimalism. Avoid clutter in everything you do in your life. Live only by what you really need.
  6. Take risks. Don’t play your life safe and end up having regrets about the things you could have done.
  7. Have a beginners mind. Have an attitude of openness and eagerness to learn and a lack of preconceptions. Face life the way a small child does, full of curiosity, wonder and amazements.

I’m sharing this list in the hope of inspiring others to come up with their own list, or copying mine and tweaking it until it matches their personality and what they want to do with their lives.

Migrating SVN Repositories to Git

I’ve recently had to migrate a few SVN repositories to Git (can you believe there are people out there still using SVN in 2014?). This is a quick guide that walks you through all the steps you’ll need to migrate your repositories including all the history, branches and tags.

The steps below will perform a one-way migration, which is what you want to do when moving permanently off SVN to use Git. There are ways to keep both the SVN and Git repositories synchronized with each other, which I won’t be discussing here.

This short guide is based on Atlassian’s excellent 6-page guide, which you should refer to if you want a more in-depth explanation.

I’ve performed the migration using Git version 1.9.3 (Apple Git) and SVN version 1.7.17. Commands may vary slightly with different versions.

1. Download Tools

The migration can mostly be performed using the Git’s build-in tools, but for convenience, Atlassian has created a set of tools that would make the migration easier.

Download Atlassian migration tools from their BitBucket repository.

2. Mount a Case-Sensitive Disk Image

Skip this steps if you are not doing the migration on OS X.

Migration needs to be performed on a case-sensitive file system. Since OS X isn’t case-sensitive, we will need to mount a case-sensitive disk image to use for the migration.

$ java -jar ~/svn-migration-scripts.jar create-disk-image 5 GitMigration
$ cd ~/GitMigration

This will create a 5 GB disk image called GitMigration.

3. Create Authors File

Next, we need to extract all the usernames that made commits to the SVN repository and convert them to Git’s format of a full name and an email address.

$ java -jar ~/svn-migration-scripts.jar authors http://svnserver/path/to/repository > authors.txt

Open the newly created authors.txt file and modify the generated placeholder names and email addresses to match their actual values.

4. Clone Repository

This will do a svn checkout and convert the repository locally to a Git repository. We are also passing in the authors file we’ve just created to use while converting the repository commits history.

This assumes that your SVN repository uses the standard layout of trunk, branches and tags.

$ git svn clone --stdlayout --authors-file=authors.txt http://svnserver/path/to/repository <git-repo-name>

$ cd ~/GitMigration/<git-repo-name>

5. Clean Repository, Branches and Tags

This will convert SVN branches and tags into standard Git branches and tags.

$ java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git --force

6. Add Remote and Push

Add a new remote to the local Git repository.

$ git remote add origin<git-repo-name>.git

Now push all branches to the newly added remote.

$ git push -u origin --all

And finally, push all tags.

$ git push --tags

Your repository has now been completely migrated to Git. The final step is to forget SVN ever existed and enjoy using Git.

Staying Productive at Home

I hate going to the office everyday. It’s noisy, full of distractions and my home workspace is far more cozy and comfortable to me than the office. I also hate the time and energy wasted on commuting everyday, and there’s no real value of being at the office when most of our work is done online anyway.

Recently I’ve been going to the office less and working from home more. While my experience with working from home has generally been positive and enjoyable, there are some things I had to take care of to make sure that my productivity is actually increasing compared to being at the office.

Every office has a lot of distractions, but your home can have many too. The television, your bed/comfy couch, family and even the fridge can be quite distracting at times. And just like when you’re at the office and you find yourself sitting in front of the computer for hours without getting any real work done, that’s even easier to happen to home.

Here are a few technique that I have been using to keep myself productive at home.

  1. Dedicate an area to be your workspace. Invest in a nice desk and an ergonomic chair. Make sure your workspace is free of distractions and away from noise. Mine looks like this.
  2. Put some structure to your day. While a nice thing about working from home is that you get to have a lot of flexibility around when to start and finish work, and when to have breaks, you still need to design a structured daily routine and try to follow it as much as possible. It surprising how much more productive people can be when they follow a daily routine.
  3. Analyze how you spend your time. Use RescueTime to analyze how much time you spend on each app/website on your computer. You’ll be amazed when you realize that yesterday’s 8 hours of coding where actually 5 and a half hours of coding, 1 hour of communication, 30 minutes of Twitter and 30 minutes of using other random apps and websites.
  4. Block distracting websites/apps. Based on your horrific findings from RescueTime, use SelfControl to set a blacklist of websites to block during your working hours. You’ll be thankful every time you try to check Twitter and have SelfControl kindly remind you that you should be coding instead.
  5. Turns off all notifications. Put both your phone and computer on Do Not Disturb. Email can wait.
  6. Schedule regular breaks. Use BreakTime to schedule regular breaks. I schedule mine every 30 minutes. During that break I get to check email and other things that were blocked using SelfControl. Most importantly I must get up from my desk and walk around for a couple of minutes to release the strain put on my body from sitting.

If you work with a team and you need to communicate daily, working from home can present some challenges. Fortunately, there are lot of tools that help you overcome those challenges. Check this post on Medium about tools to keep remote teams together.