Can you survive KL on RM10/day?

Someone posted this question in Reddit. Short answer, it depends, maybe is possible. But for me, not possible unless I eat instant noodle everyday, sacrifice lots of convenience, and discipline enough to be constantly aware and track my spending religiously.

Breakdown of the compulsory basic expenses of mine daily needs. Note the scenario excludes all other expenses like rental, entertainment, mobile phone, and others.

1. Transportation from and to workplace
Being a avid bike rider, my weekly petrol consumption is around RM12. That is like RM48 per month. Mind you, my bike is around 14-plus years old, hence fuel efficiency is not that great. In short, it will costs me around RM1.6 per day.

2. Breakfast
A tin of Milo (a very common morning drink around here) and Hup Seng Cream Crackers. 2kg Milo is around RM36 and the cream cracker is around RM 12. Both items can feed you for a month which will cost around RM1.6 per day.

3. Lunch
My co-worker told me there is a mixed rice or economy rice stall which sell 3 dishes and one bowl of rice for a price of RM3.5.

4. Dinner
Normally, mixed rice again at my place or mamak stall. Average price is around RM5.

To sum up, the calculated daily spending is roughly RM11.7 which is, RM351 per month. Unfortunately, still RM1.7 more than the expected daily RM10.

Even so, is so hard to limit yourself to this daily figure of RM11.7. Is best to limit the amount to RM600 per month or RM20 per day. There are so many unexpected influences of better half, stress, boredom, and myriad other reasons.

Best way so far for me is always keep and track your spending. Use paper money and pay everything with cash. The moment you pay anything, jot it down in your little notebook. You will feel the pain when you're aware of paying something with cash. This was proven to be scientifically true.

At least that should be a good start for me to try again to live within a monthly budget of RM600 and continue my journey for a more minimalist lifestyle.

How to design a class?

"Start with the simplest thing that works. That thing will probably be just a function. Grow it from there. If it gets too big, split it. If you find that you pass the same 12 parameters to a bunch of functions - factor out a class. If you do the same thing in a bunch of classes - abstract it out. Keep it DRY. Keep it SOLID. Rinse and repeat. This way you end up with a useful class hierarchy - and OOP won't be awful."
-- azov, emphasis added
I like his approach, build working stuff incrementally, from procedural towards Object-Oriented (OO) design when needed compare to the more theoretical and classical way on how to design a class. Way more pragmatic for those coming from more procedural experiences. Based on my observation, some programmers still struggle on adapting an OO mindset. There is nothing wrong with procedural approach but if you're using a framework, at least try to understand and follow the underlying OO structure.

Don't Be a Sheep

"Most Americans, for example, are deep in unnecessary debt, overweight and poorly nourished, inactive and stressed out, and self-sentenced to a mandatory career of unsatisfying work just to stay afloat. We constantly buy things we can’t afford and don’t need, and the majority of the trading we do does not increase our net happiness. And all of this is done with virtually no awareness of how we are affecting our own ecosystem – the tiny veneer of air and plants that is the only thing between us and the lifeless vacuum of space. In fact, it would be difficult to imagine a less efficient way to maximize “Utility” than what the modern consumer does."
-- Mr. Money Mustache, emphasis added
Not just America, but other part of the world as well. One way to reduce this insanity is to apply these age old golden rules of stop effing compare yourself to others, compare yourself to you from yesterday. Stop following the herd, the message the author tried to convey. To quote (emphasis by me):
" We design our entire lifestyles by looking around us to see what everyone else is doing. Most of us position ourselves in the middle of the herd, and start feeling deprived if we sense we are near the bottom. The problem arises when the herd is comprised mostly of sheep, responding blindly to their own irrational instincts. So as a society we have a tendency to automatically run ourselves straight off of the nearest cliff."
One thing I learned from the post is when buying something. Rather than comparing the relative prices of the item you want, check your intention with your needs and budget. Want that elegant watch? Ask yourself, do you need it and do you have the extra budget for it rather than wasting time looking for the best offer.

The 555 Notebook

"What is interesting, in these few weeks since I started using the notebook, is that I can immediately see how productive I have been and also the urgency I attach to the items that get written into this notebook."
-- Soo Ewe Jin, emphasis added
Similarly, I am still stick to the archaic way to manage my information, especially my to-do list. All these years of trying Palm, desktop computer, and mobile phone as my organizer, I still revert back my the traditional paper notepad. Maybe is just me, but I always feels more more personal and satisfying to write things down manually and cross them out when done. Furthermore, scribble down your thoughts forces you to slow down and thinks things thoroughly without worry about any battery life.

Open-office Plan

Mind you, we're not talking about the the office suite but rather about the workplace layout.  Good discussion at HN on supporting and against such arrangement. For me, Pvnick's description of a hybrid environment of open layout and private space is the best combination. You need an open layout to create bonding and increase communication and use private space to get work done without interruption.

Some recommended noise reduction, substitution, or cancellation audo devices from the discussion are:

Will try to look into ATH-M50. reddit/r/headphone has been raving non-stop about this headphone. Is time to start another fund to buy this baby.

Still Doing Cat Picture Project ?!

"For everyone reading this: if you are tired of making websites and iPhone apps for people to share their cat photos, and want to do something more consequential, consider going into computational genomics. Although Sanger sequencing was/still is used sometimes, the "next-gen" sequencing methods that have become centrally important over the last decade generate massive amounts of data that require a lot of computational analysis, something that most scientists in the field could use assistance with."
-- w1ntermute, emphasis added
Interesting. Should look into this Computational genomics. Two years ago, I made a note to myself not to work on any cat picture project anymore. Yet, I still stuck doing something similar as well in corporate world. In other words, I have not been aggressive in exploring the domain of Bioinformatics and make the best use of my skill set (what ever left of it) to anything (non-political or religious) with social impact. (I know, sounds very cheesy).

Fellow HN reader, scottalpert asked a similar question few days ago on finding a software job that help society. Numerous great answers were given but sadly, mostly are oversea positions.

There will be a lot of self-reflection in coming months, especially we're at the end of the year. What will happen in coming 2014 ? Only time will tell. Stay tuned.

Getting Into the Zone

"I'm pretty happy with them. I'm fairly easily distracted by noises: Heavy walking noises, talking, laughing, phones ringing, folks rustling potato chip bags... It can all mess up my concentration if it comes at an inopportune moment. I'm the only programmer here so most of the folks here do not understand how easy it can be to derail someone that's coding when you catch them in the middle of a thought."-- robflynn, emphasis added
Programming is a task that required a lot of cognitive processing. Hence you need to be totally immersed when coding. Any distraction will break your flow and is hard to go back to that state again. This is especially true if your're working in an open-plan office.

Rather than shifting the blame on your surrounding, why not make some adjustment to yourself ? I have been asking the same question for many years. How do you get back into the zone before or after any distraction? I've been trying two ways these days. Pomodoro time management technique and noise isolation devices.

First, Pomodoro technique. Seemed to work for me for the past one year. I always can get back to my last task safely without any issue even I may lost track of things while fire fighting.

Second. Headphone or earmuff. Decided to ditch the headphone approach as you just can't listen to music non-stop. Furthermore, wearing a headphone is not noise cancellation, is noise substitution. I am currently testing earmuff approach but experienced mixed results. There is some form noise isolation but the noise cancellation still a lot to be desired. Compare to a headphone, earmuffs felt tighter, less noisy, and you looks like a flight deck crew on one of those aircraft carriers. Also, is quite difficulty to carry a conversation with other.

In short, will still testing different kind of earmuffs and find the right one that can help me get into the zone as quick as possible.

Am I a Software Engineer ?

"I was with you until you got to this line. Let's be brutally honest: *the limiting factor for most of today's software projects (i.e. CRUD websites and iPhone apps) is not technology. It's developer competency, experience and self-discipline. I'd go so far to say that *most working software developers don't even understand the fundamentals of the technologies they're using -- it's why you see people replacing their relational databases for key-value stores, then trying to re-invent database join algorithms from scratch in the application layer. Or why every new generation of "engineers" re-discovers asynchronous programming in a new language (then promptly writes a framework in Blub...because Blub is so much better than last year's Blub.)" 
I have to concur with what fellow HN reader, timr said above (emphasis added) regarding the limiting factor of software projects. Sad but true, history keep repeating itself.

Compare to last time, we face less challenging technical issues as most of these have been solved before. Furthermore, these technical problems are googable anyway. Software development, especially web application development is nothing fancy. Once you settled down on a framework, standard conventions, version control, and bug or issue tracking. Everyday challenges are merely mundane SCRUD (Search, Create, Retrieve, Update, and Delete) implementation according to the business requirements.

So, what are the more challenging tasks these days? People, mostly relates to people issues. Especially trying to get everybody (management, product owners, and developers) to work together towards a concrete direction. Which or whose way and direction? Not sure? Yup, the problem still remains and it's damn tiring you have to focus on this bullcrap issue everyday rather than technical stuff.

I used to call myself Software Engineer but not anymore. What we are doing are not really related to engineering, as in classical engineering at all. These days, it just Application Developer or to be exact, Web Application Developer regardless what other kind of title given to me. But after reading Chris Aitchison's post, might as well start calling myself Software Gardener. or more derogatory name like Code Monkey, or Cowboy Coder.

Ubuntu 13.10 Cannot Shutdown

It had been a few days since I upgraded to Ubuntu 13.10 where I still cannot shutdown my lappy properly, the shutdown dialog was missing. Main cause seemed to be all those dock app (I am using Plank) was auto-started. Temporary solution is to delay your dock app from auto-starting as shown by command and screenshot below.
sh -c "sleep 5 && /usr/bin/plank"

Weird but it did solved my issue.

svn mergeinfo

We've slowly started to utilize Subversion branching and merging. Previously, due to some policy beyond my control, the project was branched, merged, and reviewed manually through me. But luckily these days, we've slowly started to truly utilize actual Subversion branching and merging. It will take a while for all of us to familiarize and settle down on such development style.

Several commands regarding branching and merging.

1. To create a branch
$ svn cp ^/trunk ^/branch/feature-x

2. To visualize the history of branching
$ svn mergeinfo ^/trunk ^/branch/feature-x

    youngest common ancestor
    |         last full merge
    |         |        tip of branch
    |         |        |         repository path

    100               120   
    |                  |      
  -------| |------------         trunk
       --| |------------         branches/feature_x

3. To merge from trunk to feature branch
$ svn merge ^/trunk ^/branches/feature-x

4. To check what have been merged into your branch
$ svn mergeinfo ^/trunk ^/branches/feature-x --show-revs merged

5. To check what have NOT been merged into your branch
$ svn mergeinfo ^/trunk ^/branches/feature-x --show-revs eligible

Is what I am doing actually important?

Via HN. Yes. If you're doing it only for the sake of making a living. If not, I doubt most of us are doing anything actually important. Define important. Something that creates values, improve people live, and you feels that you're doing the right thing. Something like what Mac Senour felt where the game he created let his cousin and her daughter spent more time together and his niece became an avid reader because of that. Certainly not what fellow HN reader, fit2rule experienced when the game he created actually made a 12 years old kid addicted to it in a bad way.

I once felt the same way few years back. Yes, indeed the software project was important and it did reduce corruption a bit. But in the end, I moved on. It turned out what I perceived to be important was not that actually important. My health and career took a toll (mostly myself to be blamed). If you kept doing the same thing over and over again, your technical progress will comes to a standstill. You will most likely hit a plateau. As what they said, if you're in a hole (comfort zone), stop digging, and crawl out. Hence, the best and only way is to move on. Pick your problem wisely as some problems are not worth solving or resolving again.

In short, do the right stuff, and do the actual important right stuff (I am still looking). But remember, never at the expense of your health and your family.

Upgrading to Mercurial 2.8 in Ubuntu 13.10

Update: A far more direct installation method using pip
$ sudo pip install

Mercurial, the distributed version control tool was recently released to version 2.8. Decided to give it a try after all these while. However, the default installed version in Ubuntu 13.10 is still stuck at version 2.6.3. Hence, try to upgrade it to this latest version. Installation procedure as follows.

1. Just to confirm, find the installed version using different methods. I didn't realize there are so many alternative ways to find a version for a installed packages.
$ hg --version | grep version
Mercurial Distributed SCM (version 2.6.3)

$ dpkg -s mercurial | grep Version
Version: 2.6.3-1

$ sudo apt-get install apt-show-versions
$ apt-show-versions mercurial                                                                                                                        
mercurial:amd64/saucy 2.6.3-1 uptodate

$ apt-cache policy mercurial | grep Installed
  Installed: 2.6.3-1
2. Add the Mercurial's PPA repository. Update and upgrade your packages.
$ sudo apt-add-repository ppa:mercurial-ppa/snapshots
$ sudo apt-get update
$ sudo apt-get dist-upgrade

3. Check the version again. Nope still at version 2.7.2. Have to do an installation by source code compilation.
$ hg --version | grep version
Mercurial Distributed SCM (version 2.7.2+48-5b327880a660)

4. Download the latest source code (currently 2.8) from the official website. Extract the source code and try to compile the source code.
$ wget
$ tar zxvf mercurial-2.8.tar.gz
$ cd mercurial-2.8
$ make

5. You will encounter some missing Python library. Install all the necessary packages in order to compile the source again. Before that, please make sure you have uninstall existing old Mercurial installation.
$ sudo apt-get remove --purge mercurial
$ sudo apt-get build-dep mercurial

6. Compile the source and create a deb package using checkinstall so we can remove it later.
$ make install && sudo checkinstall
$ hg version | grep version
Mercurial Distributed SCM (version 2.8)