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.

PhotosCleanerIcon

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 https://username@github.com/team/<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.

Renault Fluence Initial Thoughts

This is not a complete review of the car, but rather some quick thoughts I have after owning it for a month and having driven it for a little less than 2,000 km.

I previously had a Fiat Grande Punto. I’ve always loved small hatchbacks and I never thought I’d buy a sedan, but I grew out of my B-segment Fiat and I felt that it’s time to upgrade to a C-segment car, and the best choice for my budget happened to be a sedan.

Quality

The car is generally well put together except for the gaps between the body panels and how they fit together, which could benefit from some improvement.

The quality of the interior is quite satisfying. The model I have comes with half leather upholstery and wherever you put your hands you feel nice soft-touch plastics and leather trim. Even the hard plastic parts feel solid and not flimsy.

I have one concern though. There’s a clicking noise the comes out of the steering column when turning the steering wheel. Nothing alarming, so I’ll just wait for my first visit to the service center to have it checked.

Ride

The difference between the ride quality between my previous Grande Punto and the Fluence is night and day.

The Grande Punto had a much harder suspension which makes it seem like both the suspension and my spine are going to shatter into pieces when passing over potholes. The Fluence on the other hand feels much softer and less noisy on potholes, with no significant change in how the car grips around corners, probably due to the bigger wheelbase.

Performance

The 1.6L engine is good. Definitely not built for sporty performance, but good enough for decently-fast acceleration and quick overtaking.

What really makes driving the car so special is the CVT transmission. I won’t go into details about how CVT transmissions work but simply put, it’s a transmission without a gearbox. Instead of the gears, the transmission has a pulley system that gives you an infinite number of gear ratios. The pulleys are constantly changing their sizes to match the engine speed.

When driving the car, this results in a really weird-behaving RPM gauge. Put your foot hard on the gas pedal, and the engine will rev up to 5,500 RPM and just stay there till you lift your foot. You don’t feel the gear changes at all because, simply, there aren’t any. The engine revs will just keep jumping up and down or stay on the same number of revs depending on how hard you’re accelerating.

This kind of transmission might not appeal to everyone, but I really love it.

Equipment

The model I have is really well-equipped. It has auto this and auto that, and quite a lot of sensors.

The Renault Key Card is a joy to use. You just keep it in your pocket and you’re able to unlock and start the car. Walk away from the car and it will automatically lock itself.

I just wish it had bigger wheels because the 16″ ones look hideous with too much rubber around them.

Little Annoyances

The car has a number of little annoyances. First world problems that definitely aren’t deal breakers but make you wonder why couldn’t they just do them properly.

The trip computer has a number of these. It doesn’t calculate trip time, you can only track one trip at a time, it displays fuel consumption in the wrong unit (KM/L rather than L/100km) and the fuel range indicator is wildly inaccurate. All of these are things my much cheaper Grande Punto had/did better.

Another thing is that the steering column-mounted media controls don’t have a way to start a phone call. You can pick up a phone call from there but to start one you’ll have to reach to the central unit.

Conclusion

Overall, I’m happy about my decision. My Grande Punto was an awesome little car that was really fun to drive, but the Fluence is not making me miss it.

Hopefully I’ll be posting a more detailed review later on after I’ve driven the car more.