$ less blog.txt
This page is still kind of buggy with the pagination and format. If you prefer, see an archive of all of my blog posts.

The Most Valuable Programming Languages to Know for the Future


Originally posted on Quora: Jonathan Tsai’s answer to What is the most valuable programming language to know for the future and why?

I will have to agree with Michael Hanson’s answer as well as some of the other ones that suggest learning multiple programming languages is more beneficial than picking just one.

I myself am a multi-linguist of both human and programming languages. If you randomly survey a large body of people living within various civilizations in the world on what the most valuable human languages are, the answers you’ll get back are likely to be English, Chinese, French, Spanish (not necessarily, but roughly, in that order).

When you know multiple languages, learning additional ones become much easier, because through immersion/osmosis, you are made aware of the different types of parts of speech, recognize the cognates and influences of one language to another, etc. That’s why you will frequently come across Europeans who speak at least 3 languages (English, French, and the language of their country), and Indians who speak 3-5 languages or more (English, Hindi, the language of their state/region, + neighboring state/region).

Programming languages actually have a much simpler syntax than human languages. The more you know, the easier it is to learn more.

I would rephrase the question as plural instead of asking for a singular response: What are the most valuable programming languages to know for the future and why?

If you like lists, this section is for you, but not in any particular order:

  • Python - frequently used by scientific and statistics communities and data science; it’s a fairly easy language to learn and remember with libraries for just about everything you would need, and a very active development community who can whip up a library if one doesn’t exist already. Personally, Python is really easy to me and reads and writes just like pseudocode. I’ve written as many as 100-200 lines on a whiteboard or a text editor in one sitting and was able to execute the code in the interpreter without any syntax errors.
  • Ruby - I am not a regular practitioner, but Ruby is also very powerful in that it is an interpreted language like Python, which means that it doesn’t need to be compiled before it’s run. A lot of famous websites are built on, and many of my friends who are paid handsomely, use Ruby, due to the popularity of the Rails framework (Ruby on Rails)
  • Java - This one is nice because it’s a compiled language and the compiler can optimize the heck out of the code, and it runs really fast. There are lots of Java practitioners, and the majority of financial websites (banks, stock trading platforms, etc), will use Java because of its outstanding speed and performance characteristics. Incidentally, Java is also the language used by the Android operating systems, so if you want to learn to write for something like 79-80% of the world’s mobile users, this is the way to go. (Source: 2014: The iPhone 6 Had Better Be Amazing And Cheap, Because Apple Is Losing The War To Android; 2015: Apple iOS And Google Android Smartphone Market Share Flattening: IDC)
  • JavaScript - Rich web applications / the entire frontend / look-and-feel of all modern websites. Enough said. JavaScript is a language that is write once, runs everywhere. Browsers going all the way back to 1998 (?) and even earlier have been using JavaScript, and the language along with its frameworks and ecosystem have improved tremendously over time, as well as its performance characteristics due to progressive developments of JavaScript runtimes (e.g. V8).
  • Shell Scripting / Bash - Unix utilities are awesome. They are lightweight, fast, and often times, you can just use an existing Unix utility for doing common but advanced tasks like searching and sorting on a single machine, and additional various things.
  • C++ / C - it still powers lots of high performance systems, but is a bit more cumbersome to write than Java, hence the reason that Java is the language of choice when building such systems. However, this is a very low-level language, and the thing about programming languages is that their interpreters and compilers are quite meta–if you chase it up/down the stack far enough, you’ll find that some/most of them are inevitably implemented in C. Not much daily use, but if you like learning the nitty gritty or really knowing what’s under the hood (analogous to learning Greek / Latin to having a better grasp on English), then this is something you have to learn.
  • Swift - this is a new language that Apple developed over the past few years and just launched last year (2014). I won’t go digging up the links because you can easily find them, but the language designers designed Swift to be a modern language that can be compiled but also has several characteristics of interpreted languages and IDE tools (like quick turn-around of write code-and-execute), and admittedly it borrows a lot of ideas and nice features of other languages like Ruby, Python, JavaScript, as well as Java and C. And it’s also inter-operable with Objective C. Look up the WWDC videos of the Swift language being unveiled (…), and you’ll hear loud cheering and clapping and whooping over small features. I cheered along with the rest when I watched from home.

I would be hard-pressed to give you a ranked list since I don’t know the statistics off the top of my head, but my impression is that the above are your programming language lingua francas, and most likely the highest value in terms of popularity/ubiquity, economic value, and utility.

View original question on Quora

Hack GitHub Streaks


Tonight, I was doing some research and maintenance on a couple of my open-source projects. In particular, I had recently learned about EditorConfig (which BTW, is a great idea! and a standard EVERYONE should adopt), and wanted to add it to most of my projects.

That brought me to my GitHub homepage, and I caught a glimpse of my GitHub streak. Only 2 days! I was on a roll for a few days, and then a few days of working on private projects reset my streak.

Not that it matters, anyways, but I was slightly bothered, and being the fan of automation that I am, I quickly thought up how to automate my GitHub contributions to keep my streak alive, artificially.

30 minutes later, github-streak is born and released to the world. I call that being diligent at slacking off.

It’s a fairly straightforward project that had a few requirements/constraints as I designed it:

  • Had to be portable, modular
  • Had to be cross-platform, as much as possible
  • Had to be really simple technology and minimal dependencies–don’t overthink it

The result:

  • Written in BASH/shell script (my favorite shell)
  • Even uses the conscientious #!/usr/bin/env bash shebang directive
  • Creates a symlink in /etc/cron.daily – probably won’t work for every system, but at least was available on my webserver and others that I’ve used in the past
  • The script just appends a date string to a .streak file (hey, a new convention!) and git commits/git pushes
  • Added in the .editorconfig and .travis.yml goodies
  • MIT licensed (my favorite open-source license)

So, here you go internet, have at it: github-streak

Show some star/fork love. Plz thx kbye.

Edit: Here are some other GitHub projects worth checking out that manipulate commit history as art:

Equality and Inequalities in JS and PHP


It’s 2015, and from time to time I still see a lot of == peppered throughout codebases that I work with, and just wanted to share a few posts that might change your mind =)


=== and its complement !== and should be used like 99% of the time because it is faster and more accurate.

> 0 == "0"
< true
> 0 === "0"
< false
> 0 == false
< true
> "0" == false // really?
< true
> !!"0"
< true
> !"0"
< false
> "0" === false
< false

There are more perverse and mind-bending examples that are out there, but I’ll leave you with those for now.

As you can see, the former == does type coercion, which is lazy way of doing comparisons without casting data explicitly, and can find yourself in hot water down the line. The latter === does type checking first, and then checks equality of the values.

Protip #1: If you want to test a JS expression or figure out some syntax really quickly, just open your JS console in the browser inspect tool.

Protip #2: If testing for something truthy or falsy, a nice trick is to just do use the ! operator twice (!!). As can be seen above, JS treats non-empty strings as a truthy (yet, strangely, "0" == false)

WordPress' New JetPacks All-Sites Dashboard


The JetPacks 3.3 upgrade that allows you to manage and administer multiple WordPress sites from one account is a breeze to use!

I’m not quite used to it yet and still getting acclimated, but I think it’s a great time-saver and will grow on me more over time.

I can see it as a great feature to use once a site for daily workflows in updating content once a site’s major structural and design work has been done.

Cheers to the WordPress team for this great feature!

Read all about it in the original post.

Upgrading to Ubuntu 14.04.1 LTS


tl;dr; When upgarding from Ubuntu 12.04 to 14.04 LTS, the Apache also gets upgraded from 2.2 to 2.4. There are lots of backwards incompatible changes.

I just spent the last 3 hours fixing my server after impulsively upgrading to Ubuntu 14.04.1 LTS from Ubuntu 12.04.

Well, not exactly that impulsively. I had seen this pestering MOTD-style message upon login for weeks now, and I figured that since 14.04.1 is a point release nearly 6 months after the initial release, it should be relatively issue-free.

I had already done 3 upgrades from 12.04 LTS to 14.04 LTS… on desktops. Two had gone successfully, and one on my parents’ computer unfortunately messed up pretty badly in the middle so that some of the ubuntu-desktop stuff is just not working properly, but I digress.

I figured that since it was a Friday night in addition to the above–“What the heck, why not?”–and dove right in. The OS upgrade was pretty much issue free. I let out a sigh of relief.

And then my luck ran out. All of my websites didn’t load. Read: Nothing worked. I started getting Pingdom pages and Nagios alerts non-stop.

Thankfully, the Internet is a great resource and I was able to identify the problem pretty quickly. Applying the fix is what took most of the time.

Most useful of all the resources that I came across was Upgrading Apache 2.2 to 2.4. I’d recommend reading through it thoroughly if you’re going through the upgrade yourself, but here are some highlights:

  • Don’t be alarmed if all you’re seeing for any of your websites is just the contents of /var/www/ or /var/www/html
  • All separate virtual host (VirtualHost) files and configurations need to end in *.conf due to the command in /etc/apache2/apache2.conf IncludeOptional sites-enabled/*.conf
  • It still wasn’t pulling in my VirtualHost
  • Got rid of NameVirtualHost *:80 as the first line in all of my VirtualHost config files. It wasn’t necessary. Good riddance.
  • Directory permissions now need to be explicitly granted. Require all granted (the old style was Order Deny, Allow; Allow from all)
  • I noticed that my websites were loading slowly, so needed to set EnableSendfile On in the main config file (apache2.conf)
  • For my Django sites, I needed to change the Directory permissions for the static files directory
  • For my custom WordPress sites, I needed to set the Directory permissions for the DocumentRoot as well as explicitly set AllowOverride all to allow picking up the .htaccess
  • /etc/php5/apache2/php.ini has short_open_tag disabled. I decided to leave it off and change my limited number of PHP applications that were using short open tags, because it’s better practice.

Other helpful resources:

Make a Donation