Latest posts

Convert Multiple Images Into One Single PDF

A lot of manga series found online are in image format, like JPG or PNG and it's one image for one page. Mac's Preview app can read them if needed, but that's not very convenient. It would be nice to convert them into one single PDF file so that it can be read in any device and easily shared with others. This can be accomplished with a command-line tool ImageMagick on Mac.

Basic PostgreSQL Commands

We use MySQL for Linkqlo app as that was part of the good old stack of PHP-MySQL chosen by the IT vendor we worked with. In 2015~2016 as we gradually refactored PHP endpoints into Haskell, we started running into various issues of MySQL since some of its libraries didn't work well with Haskell or our deployment script. Eventually they were all fixed, but it was a big hassle. For our new Mirror Mirror app, since it was built from scratch, we chose a stack that would fully leverage our technical capability - Haskell for endpoints, React-Native for front-end, PostgreSQL for database, and Nix for deployment.

Favorite Podcasts of 2017

Back in 2008~2009 when I was soaked in the underground music scene in Beijing, I thought about creating an English podcast to introduce indie rock music from China to the western audience. The inspiration came from a four-hour mp3 file of Anthony Wong of Tat Ming Pair of Hong Kong in his early radio DJ years. In this audio clip Anthony Wong was commenting in Cantonese on Depeche Mode's latest album in the background music of Tour de France by Kraftwerk. It was devilishly cool.

Blogging On Pelican

I've come to really enjoy Pelican since moving my personal blog from wordpress to static site generator Pelican on a Github Page in 2014. It's not the easiest thing to set up in the beginning and it took me months in countless iterations to settle down a well-tuned configuration that met my needs. The end-game is very satisfying though.

How To Git Tag A Commit

Tagging helps to keep track of key versions of a codebase. During the last few frenzy days toward submission of a new app to iTunes Connect, I sometimes make 10~20 commits a day to clean up various small patches here and there. One month from now when memory becomes hazy, it's important to be able to identify exactly which version of the binary on the git server corresponds to the one that is currently available in App Store. I follow the below workflow to tag a particular commit.

My Git Work Flow

Here's the git flow I use while working on our latest iOS app Mirror Mirror

How to Serve Wordpress Site from Subdirectory

Wordpress by default is installed in the root directory var/www/ This causes a lot of inconvenience as often we need to install other files into separate subdirectories under root directory. A good installation practice should keep every project in its own subdirectory.

Set Up VPS on Linode - Part 2

Continuing from Set Up VPS on Linode - Part 1, here's Part 2 on DNS (nameserver and IP address), Apache (folder structure, virtual hosts), and enabling HTTPS with SSL certificate from Let's Encrypt.

Set Up VPS on Linode - Part 1

Recently I had to set up virtual-private-server (VPS) for both my personal blog the Good, the Bad, and the Curious and Linkqlo's website. Here is my workflow to set up Ubuntu Linux, Apache server and the server environment on Linode, which is one of the more popular VPS service providers along with Digital Ocean. Linode's Getting Started Guide is a helpful reference for the basics.

排骨煨汤 (Pork Ribs Soup)

湖北人爱喝汤,小时候在家里几乎无汤不成席。武汉北面东西湖的莲藕特别粉嫩,很适合煨汤,跟排骨是绝配。排骨藕汤是最销魂的一道湖北菜,是湖北妈妈召唤海外儿女的超级大招。对湖北人来说,家的味道就是排骨煨汤的味道。可惜在美国从大华超市,Trader Joe's, Whole Foods, 到Mitsuwa都找不到这样的藕。爸爸灵机一动,计上心来,用白萝卜替代莲藕,效果惊艳。2016年湾区的冬天寒风凛冽,阴雨连绵,我们就窝在家里喝了整整一个冬天的排骨煨汤。