aboutsummaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/blog/2014-10-20-hello-octopress.md3
-rw-r--r--source/blog/2014-10-20-help-mou-hit-1-dot-0.md3
-rw-r--r--source/blog/2014-10-21-get-rolling.md3
-rw-r--r--source/blog/2014-10-23-ripping-copy-protected-dvd-with-mpv.md3
-rw-r--r--source/blog/2014-10-24-charles-munger-donated-$65m-to-kitp.md3
-rw-r--r--source/blog/2014-10-25-os-x-package-receipts.md3
-rw-r--r--source/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md3
-rw-r--r--source/blog/2014-10-26-disk-visualizer-daisydisk.md3
-rw-r--r--source/blog/2014-10-27-onedrive-goes-unlimited.md3
-rw-r--r--source/blog/2014-10-28-google-drive-no-selective-subfolder-sync.md3
-rw-r--r--source/blog/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md3
-rw-r--r--source/blog/2014-10-29-fun.md3
-rw-r--r--source/blog/2014-11-02-vobcopy-dvdbackup-etc.md3
-rw-r--r--source/blog/2014-11-05-apple-is-pushing-yosemite-hard.md3
-rw-r--r--source/blog/2014-11-05-list-youtube-playlist-with-youtube-dl.md6
-rw-r--r--source/blog/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md3
-rw-r--r--source/blog/2014-11-07-interstellar.md3
-rw-r--r--source/blog/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md3
-rw-r--r--source/blog/2014-11-11-re-encoding-everything-for-iphone-6-plus.md3
-rw-r--r--source/blog/2014-11-19-convolution-of-irreducible-characters.md3
-rw-r--r--source/blog/2014-11-20-dropbot-for-geeks(r).md3
-rw-r--r--source/blog/2014-11-24-iphone-photography-frustration.md3
-rw-r--r--source/blog/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md3
-rw-r--r--source/blog/2014-11-25-i-got-16-gigs-of-ram.md3
-rw-r--r--source/blog/2014-11-26-original-images-in-day-one-journal.md3
-rw-r--r--source/blog/2014-11-28-given-infinite-time.md3
-rw-r--r--source/blog/2014-11-28-going-diceware.md3
-rw-r--r--source/blog/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md3
-rw-r--r--source/blog/2014-12-05-distraction-free-writing.md3
-rw-r--r--source/blog/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md3
-rw-r--r--source/blog/2014-12-13-the-mac-like-evernote.md3
-rw-r--r--source/blog/2014-12-14-speeding-up-emacs-with-emacsclient.md3
-rw-r--r--source/blog/2014-12-14-the-google-chrome-comic-a-classic.md3
-rw-r--r--source/blog/2014-12-19-app-suggestion-dropzone-3.md3
-rw-r--r--source/blog/2014-12-22-10k-images-on-imgur.md3
-rw-r--r--source/blog/2014-12-23-mpv-launcher.md3
-rw-r--r--source/blog/2015-01-01-os-x-system-ruby-encoding-annoyance.md3
-rw-r--r--source/blog/2015-01-10-fonts-why-chinese-web-design-is-hard.md3
-rw-r--r--source/blog/2015-01-21-web-design-microsoft-vs-apple.md3
-rw-r--r--source/blog/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md3
-rw-r--r--source/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md3
-rw-r--r--source/blog/2015-02-20-my-dock-and-updated-omnifocus.md3
-rw-r--r--source/blog/2015-02-21-all-is-not-lost.md3
-rw-r--r--source/blog/2015-02-24-the-new-onedrive-api.md3
-rw-r--r--source/blog/2015-03-22-back-up-os-x-app-icons.md3
-rw-r--r--source/blog/2015-04-26-using-python-3-with-emacs-jedi.md3
-rw-r--r--source/blog/2015-05-03-why-oh-my-zsh-is-completely-broken.md3
-rw-r--r--source/blog/2015-05-05-graceful-handling-of-sigint-when-using-pythons-multiprocessingprocess.md3
-rw-r--r--source/blog/2015-05-05-new-blog-new-start.md3
-rw-r--r--source/blog/2015-05-06-searchable-settings-are-one-honking-great-idea-lets-do-more-of-those.md3
-rw-r--r--source/blog/2015-05-09-storyboard-reached-01.md3
-rw-r--r--source/blog/2015-05-19-bash-the-special-slash-character-in-filename-expansion.md3
-rw-r--r--source/blog/2015-05-22-using-a-command-table-as-wallpaper.md3
-rw-r--r--source/blog/2015-05-29-apples-customer-service-is-still-the-best-plus-an-authy-horror-story.md3
-rw-r--r--source/blog/2015-05-30-using-a-personal-helper-package-in-everyday-scripting.md3
-rw-r--r--source/blog/2015-06-07-stackoverflow-review-system-is-completely-bs.md3
-rw-r--r--source/blog/2015-06-08-apple-turns-its-homepage-into-a-wwdc-liveblog.md3
-rw-r--r--source/blog/2015-06-10-chrome-disappointment-the-shabby-and-boring-old-bookmark-system-from-stone-age-strikes-back.md3
-rw-r--r--source/blog/2015-06-12-the-tip-of-the-iceberg.md3
-rw-r--r--source/blog/2015-06-23-all-problems-solved.md3
-rw-r--r--source/blog/2015-06-26-ios-9-searchable-settings.md3
-rw-r--r--source/blog/2015-06-27-automatically-clean-up-previous-mobile-applications.md3
-rw-r--r--source/blog/2015-06-29-dl-cmplnts-in-apple-news.md3
-rw-r--r--source/blog/2015-07-15-zsh-save-stdout-stderr-and-return-value-of-command-to-different-variables-without-temp-file.md3
-rw-r--r--source/blog/2015-07-19-github-experimental-attachment-formats-pdf-docx-and-pptx.md3
-rw-r--r--source/blog/2015-07-25-dl-cmplntss-web-doesnt-suck.md3
-rw-r--r--source/blog/2015-07-30-the-sad-state-of-finder-on-el-capitan.md3
-rw-r--r--source/blog/2015-08-02-sync-chrome-bookmarks-with-safari-on-os-x.md3
-rw-r--r--source/blog/2015-08-05-should-apple-split-up-itunes-on-os-x.md3
-rw-r--r--source/blog/2015-08-05-switching-to-capitalized-commit-messages.md3
-rw-r--r--source/blog/2015-08-13-other-peoples-___.md3
-rw-r--r--source/blog/2015-08-14-laymen.md3
-rw-r--r--source/blog/2015-08-20-i-installed-blockparty-and-the-only-thing-i-can-say-is-wow.md3
-rw-r--r--source/blog/2015-08-20-ios-9-turn-off-wi-fi-assist.md3
-rw-r--r--source/blog/2015-08-25-automated-os-x-provisioning.md3
-rw-r--r--source/blog/2015-08-31-after-all-these-years-10pt-non-anti-aliased-monaco-is-still-the-best.md3
-rw-r--r--source/blog/2015-09-21-zsh-51-and-bracketed-paste.md3
-rw-r--r--source/blog/2015-09-24-apple-watch-digital-crown-tightness-issue.md3
-rw-r--r--source/blog/2015-09-25-removing-google-analytics-from-this-blog.md3
-rw-r--r--source/blog/2015-10-01-auto-hidden-menu-bar-dock-maximized-window-is-the-new-full-screen-mode.md3
-rw-r--r--source/blog/2015-10-01-upgrading-to-el-capitan.md3
-rw-r--r--source/blog/2015-10-03-we-need-an-os-x-security-white-paper.md3
-rw-r--r--source/blog/2015-10-10-printing-long-80-character-per-line-plain-text-document-in-two-columns.md3
-rw-r--r--source/blog/2015-10-12-the-importance-of-dated-detailed-release-notes.md3
-rw-r--r--source/blog/2015-10-14-follow-up-the-sad-state-of-finder-on-el-capitan.md3
-rw-r--r--source/blog/2015-10-14-sip-for-the-greater-good.md3
-rw-r--r--source/blog/2015-10-26-att-to-pure-talkusa-one-month-later.md3
-rw-r--r--source/blog/2015-11-06-microsoft-drops-unlimited-onedrive-storage-after-people-use-it-for-unlimited-storage.md3
-rw-r--r--source/blog/2015-11-15-we-need-a-programming-keyboard-on-ios.md3
-rw-r--r--source/blog/2015-11-25-bash-function-exporting-fiasco.md3
-rw-r--r--source/blog/2015-12-08-safeguarding-git-repos-against-accidental-rm.md3
-rw-r--r--source/blog/2015-12-16-spoiled-by-retina-in-less-than-a-day.md3
-rw-r--r--source/blog/2015-12-20-regex-flavor-hell.md3
-rw-r--r--source/blog/2015-12-26-autoenv-with-auto-cleanup.md3
-rw-r--r--source/blog/2015-12-27-lesson-on-magic-method-access-of-python-new-style-classes-from-my-failed-python3-port-of-tomorrow.md3
-rw-r--r--source/blog/2015-12-28-why-i-want-lossless-music-on-itunes-music-store.md3
-rw-r--r--source/blog/2015-12-29-catches-when-installing-windows-7-with-boot-camp.md3
-rw-r--r--source/blog/2016-01-01-virtualenvs-for-everyone.md3
98 files changed, 199 insertions, 98 deletions
diff --git a/source/blog/2014-10-20-hello-octopress.md b/source/blog/2014-10-20-hello-octopress.md
index 16f60ccd..af095d16 100644
--- a/source/blog/2014-10-20-hello-octopress.md
+++ b/source/blog/2014-10-20-hello-octopress.md
@@ -2,7 +2,8 @@
title: "Hello, Octopress!"
date: 2014-10-20T16:53:00-0700
date_display: October 20, 2014
----
+...
+
This post marks my transition from Tumblr to Octopress & GitHub Pages.
I've been microblogging for a while at [zshello3.tumblr.com](http://zshello3.tumblr.com) and I liked it. Not because of readers, which I suspect I have none; but there are certainly a huge amount of information I want to dump off my mind. Back in the days I *loved* my handwritten journals, and I really poured a lot into them. Peers were usually amazed when they saw my journals. These days typing seems to be a more robust solution to keeping my thoughts, especially when the thoughts are mostly technical.
diff --git a/source/blog/2014-10-20-help-mou-hit-1-dot-0.md b/source/blog/2014-10-20-help-mou-hit-1-dot-0.md
index 12b08e04..1be5e3c1 100644
--- a/source/blog/2014-10-20-help-mou-hit-1-dot-0.md
+++ b/source/blog/2014-10-20-help-mou-hit-1-dot-0.md
@@ -2,7 +2,8 @@
title: "Help Mou hit 1.0"
date: 2014-10-20T17:37:45-0700
date_display: October 20, 2014
----
+...
+
Quick call for [Mou 1.0 fundraiser](https://www.indiegogo.com/projects/mou-1-0-markdown-editor-on-os-x-for-you) on Indiegogo. At the time of writing, it has raised $6,178/$20,000, and has 39 days to go (with 21 already passed).
diff --git a/source/blog/2014-10-21-get-rolling.md b/source/blog/2014-10-21-get-rolling.md
index 10e9ad59..d3b00a65 100644
--- a/source/blog/2014-10-21-get-rolling.md
+++ b/source/blog/2014-10-21-get-rolling.md
@@ -2,7 +2,8 @@
title: "Get rolling"
date: 2014-10-21T11:40:14-0700
date_display: October 21, 2014
----
+...
+
Yesterday, on an internet forum, I saw someone’s signature, which translates to
> Don’t even get started if you know you can't know from the beginning that you won't make it to the very end.
diff --git a/source/blog/2014-10-23-ripping-copy-protected-dvd-with-mpv.md b/source/blog/2014-10-23-ripping-copy-protected-dvd-with-mpv.md
index e6d19e90..5ead2e94 100644
--- a/source/blog/2014-10-23-ripping-copy-protected-dvd-with-mpv.md
+++ b/source/blog/2014-10-23-ripping-copy-protected-dvd-with-mpv.md
@@ -2,7 +2,8 @@
title: "Ripping copy-protected DVD with mpv"
date: 2014-10-23T20:03:22-0700
date_display: October 23, 2014
----
+...
+
**_11/02/2014 update:_**
See [this post](/blog/2014-11-02-vobcopy-dvdbackup-etc.html) for issues, explanations, and more.
diff --git a/source/blog/2014-10-24-charles-munger-donated-$65m-to-kitp.md b/source/blog/2014-10-24-charles-munger-donated-$65m-to-kitp.md
index c410cc72..2cb75144 100644
--- a/source/blog/2014-10-24-charles-munger-donated-$65m-to-kitp.md
+++ b/source/blog/2014-10-24-charles-munger-donated-$65m-to-kitp.md
@@ -2,7 +2,8 @@
title: "Charles Munger donated $65M to KITP"
date: 2014-10-24T16:41:36-0700
date_display: October 24, 2014
----
+...
+
Today's news has it that Charles Munger made a $65 million donation to KITP at UCSB. See for instance [this article](http://nyti.ms/1D4zg24) on NYT. Of course I didn't learn it from NYT (I'm generally sick of any news other than math, physics, or IT-related ones). I learned it from [Not Even Wrong](http://www.math.columbia.edu/~woit/wordpress/?p=7247) instead (of course I don't agree with Woit, but some of his links are nice).
I have no interest whatsoever in the business world, so I have no idea about Warren Buffett's business partners (although I'm still worldly enough to know Warren Buffett). However, the name Charles Munger sounded surprisingly familiar. After reading the sentence
diff --git a/source/blog/2014-10-25-os-x-package-receipts.md b/source/blog/2014-10-25-os-x-package-receipts.md
index 54ec1905..99e20bed 100644
--- a/source/blog/2014-10-25-os-x-package-receipts.md
+++ b/source/blog/2014-10-25-os-x-package-receipts.md
@@ -2,7 +2,8 @@
title: "OS X package receipts"
date: 2014-10-25T13:26:02-0700
date_display: October 25, 2014
----
+...
+
I just learned something new. Whenever you install a `pkg` on OS X, OS X stores a receipt of what was installed in `/var/db/receipts` (I'm running OS X 10.9.5 at the time of writing), called a **bom** — bill of materials (I’d rather call it a manifest, whatever). This feature was introduced in NeXTSTEP. From `man 5 bom`:
> The Mac OS X Installer uses a file system "bill of materials" to determine which files to install, remove, or upgrade. A bill of materials, **bom**, contains all the files within a directory, along with some information about each file. File information includes: the file's UNIX permissions, its owner and group, its size, its time of last modification, and so on. Also included are a checksum of each file and information about hard links.
diff --git a/source/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md b/source/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md
index b37c81e0..f3ad244e 100644
--- a/source/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md
+++ b/source/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md
@@ -2,7 +2,8 @@
title: "Convert Audio CD/DVD to ISO image on OS X"
date: 2014-10-26T23:29:47-0700
date_display: October 26, 2014
----
+...
+
**_11/02/2014 update:_**
See [this post](/blog/2014-11-02-vobcopy-dvdbackup-etc.html) for issues, explanations, and more.
diff --git a/source/blog/2014-10-26-disk-visualizer-daisydisk.md b/source/blog/2014-10-26-disk-visualizer-daisydisk.md
index 4c62b3ed..75d4aa4f 100644
--- a/source/blog/2014-10-26-disk-visualizer-daisydisk.md
+++ b/source/blog/2014-10-26-disk-visualizer-daisydisk.md
@@ -2,7 +2,8 @@
title: "Disk visualizer: DaisyDisk"
date: 2014-10-26T00:02:22-0700
date_display: October 26, 2014
----
+...
+
DaisyDisk is a pretty famous name. I’ve heard a lot that DaisyDisk is beautiful, but as a “power user” I always feel ashamed about using a disk analyzer or visualizer (although no one really cares). I’m pretty comfortable with doing most filesystem operations right in the shell, and for other tasks too tedious for the shell (like renaming a bunch of files with no obvious pattern), Finder (equipped with TotalFinder) works just fine.
Today I was trying clean up my drive a bit, as there were only 22GB left. I knew where the main problem lied: a huge number of highres videos lying in `~/vid/staging`, awaiting renaming and migration to my external drive. Anyway, it would be nice to have some visualization of a detailed breakdown of my disk usage, preferably on any level I want without multiple passes of `du`. The name DaisyDisk popped up from the cache in my brain, so I headed over to their website to download it.
diff --git a/source/blog/2014-10-27-onedrive-goes-unlimited.md b/source/blog/2014-10-27-onedrive-goes-unlimited.md
index 40318545..d92d2cc4 100644
--- a/source/blog/2014-10-27-onedrive-goes-unlimited.md
+++ b/source/blog/2014-10-27-onedrive-goes-unlimited.md
@@ -2,7 +2,8 @@
title: "OneDrive goes unlimited"
date: 2014-10-27T09:44:51-0700
date_display: October 27, 2014
----
+...
+
**10/28/2014 Update:**
Yesterday Microsoft pushed an update to OneDrive.app to MAS. After uninstalling, reinstalling, and wiping the 10 GB folder I'd like to sync (that's for photos; I upload videos via the web interface) on both client and server sides, it actually began to work. The speed was around 1 MB/s during my last sync of 10 GB worth of data. Not fast, but I will be fairly satisfied if it can keep up with that speed. Time will tell.
diff --git a/source/blog/2014-10-28-google-drive-no-selective-subfolder-sync.md b/source/blog/2014-10-28-google-drive-no-selective-subfolder-sync.md
index 6dad0652..51c3e025 100644
--- a/source/blog/2014-10-28-google-drive-no-selective-subfolder-sync.md
+++ b/source/blog/2014-10-28-google-drive-no-selective-subfolder-sync.md
@@ -2,7 +2,8 @@
title: "Google Drive — no selective subfolder sync?"
date: 2014-10-28T20:49:24-0700
date_display: October 28, 2014
----
+...
+
Up to this point I've been using Google Drive as an online backup service, and uploads files mostly manually, although I do sync `~/img` with the client.
**Aside.** Google Drive, OneDrive, etc. don't work with symlinks. Wanna keep your stuff free and duplicate-free yet still synced to the servers? Use `rsync` to automatically reproduce your folder structure with hard links:
diff --git a/source/blog/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md b/source/blog/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md
index 2563dc06..540e3bc7 100644
--- a/source/blog/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md
+++ b/source/blog/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md
@@ -2,7 +2,8 @@
title: "Mou 1.0 fundraiser: goal reached"
date: 2014-10-28T01:57:06-0700
date_display: October 28, 2014
----
+...
+
A week ago I wrote a post [*Help Mou hit 1.0*](blog/2014/10/20/help-mou-hit-1-dot-0/). Today, I'm delighted to find out that Mou has reached its goal, $20,000, half way into the fundraiser.
![Mou hit its goal on Indiegogo](https://i.imgur.com/vM298t5.png)
diff --git a/source/blog/2014-10-29-fun.md b/source/blog/2014-10-29-fun.md
index a8f662ce..f3a6b09a 100644
--- a/source/blog/2014-10-29-fun.md
+++ b/source/blog/2014-10-29-fun.md
@@ -2,7 +2,8 @@
title: "Fun"
date: 2014-10-29T11:26:29-0700
date_display: October 29, 2014
----
+...
+
This happened in yesterday's Math 210A lecture.
diff --git a/source/blog/2014-11-02-vobcopy-dvdbackup-etc.md b/source/blog/2014-11-02-vobcopy-dvdbackup-etc.md
index 52fac4d7..adcb1e95 100644
--- a/source/blog/2014-11-02-vobcopy-dvdbackup-etc.md
+++ b/source/blog/2014-11-02-vobcopy-dvdbackup-etc.md
@@ -2,7 +2,8 @@
title: "vobcopy, dvdbackup, etc."
date: 2014-11-02T15:06:07-0800
date_display: November 2, 2014
----
+...
+
A few days ago, I was cloning my entire Audio CD and DVD collection, and reported some of the findings in [this post](/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.html). As said, the most important commands are
hdiutil makehybrid -iso -joliet -o AUDIO_CD_NAME.iso SOURCE
diff --git a/source/blog/2014-11-05-apple-is-pushing-yosemite-hard.md b/source/blog/2014-11-05-apple-is-pushing-yosemite-hard.md
index 68d727d2..a50299c7 100644
--- a/source/blog/2014-11-05-apple-is-pushing-yosemite-hard.md
+++ b/source/blog/2014-11-05-apple-is-pushing-yosemite-hard.md
@@ -2,7 +2,8 @@
title: "Apple is pushing Yosemite hard"
date: 2014-11-05T22:17:01-0800
date_display: November 5, 2014
----
+...
+
Apple is pushing Yosemite hard and secretly Yosemitizing things. iTunes was updated to its shiny new look on Mavericks, day one upon Yosemite launch. I liked it. The only problems I had with the new iTunes are:
* It's no longer possible to go to the Artists view and Music Videos view with one click. Artists is now a drop-down menu option in My Music view; Music Videos is now a sidebar tab in Playlists view.
diff --git a/source/blog/2014-11-05-list-youtube-playlist-with-youtube-dl.md b/source/blog/2014-11-05-list-youtube-playlist-with-youtube-dl.md
index cd46078c..18eda3af 100644
--- a/source/blog/2014-11-05-list-youtube-playlist-with-youtube-dl.md
+++ b/source/blog/2014-11-05-list-youtube-playlist-with-youtube-dl.md
@@ -2,7 +2,8 @@
title: "List YouTube playlist with youtube-dl"
date: 2014-11-05T10:37:58-0800
date_display: November 5, 2014
----
+...
+
Of course you are always welcome to use the [Google APIs Client Library for Python](https://developers.google.com/api-client-library/python/) to wrestle with YouTube, which is usually pretty simple. (As an added bonus, YouTube has some [nice runnable sample scripts](https://developers.google.com/youtube/v3/code_samples/) to get you started.) With the client library, listing videos in a YouTube playlist is a breeze.
However, if you don't feel like writing code yourself (I usually don't feel like writing code myself until I use something often enough and existing solutions are suboptimal), `youtube-dl` recently added the functionality to list videos in a playlist with the `--flat-playlist` option.
@@ -21,6 +22,7 @@ However, if you don't feel like writing code yourself (I usually don't feel like
[download] Downloading video #3 of 119
[download] Downloading video #4 of 119
...
+
```
which doesn't really make sense — it tells you that it collected 119 video ids, and no more. Once you have `-j` on, you get JSON data that you can parse with anything:
@@ -32,6 +34,7 @@ which doesn't really make sense — it tells you that it collected 119 video ids
{"url": "znW5ALwWNQw", "_type": "url", "ie_key": "Youtube", "id": "znW5ALwWNQw"}
{"url": "qyE7-auTIcc", "_type": "url", "ie_key": "Youtube", "id": "qyE7-auTIcc"}
...
+
```
The most straightforward way to parse this is to use a command line JSON parser, the best one being [jq](https://github.com/stedolan/jq):
@@ -43,6 +46,7 @@ https://youtube.com/v/j9l5nchv1Z8
https://youtube.com/v/znW5ALwWNQw
https://youtube.com/v/qyE7-auTIcc
...
+
```
There you go, a list of URIs you can use. Of course you can put this in a script to save some typing:
diff --git a/source/blog/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md b/source/blog/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md
index 45550498..9bdecacd 100644
--- a/source/blog/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md
+++ b/source/blog/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md
@@ -2,7 +2,8 @@
title: "2014 Nobel Prize in Physics — LED lights, seriously?"
date: 2014-11-06T11:08:45-0800
date_display: November 6, 2014
----
+...
+
For some reason, I only learned about this year’s laureates today, through [the reference frame](http://motls.blogspot.com/2014/11/ex-employer-wont-meet-blue-led-nobel.html). The prize goes to the inventors of the LED. Not exciting at all, so I don’t care if I’m ever informed. (Lubos has a good point on why applied physics — well, let’s even widen the concept of applied physics a bit — should not surprise anyone when they appear in a Nobel Prize announcement: “After all, Alfred Nobel might have very well considered his dynamite to be a discovery in physics, too.”)
The Nobel Prize Physics Awards has been rather amusing in recent years. Partly due to controversy on the theoretical front and no breakthrough on the experimental front, I guess. (The discovery of Higgs was a breakthrough to some extent, but it was totally expected; little physics beyond SM at LHC before LS1 is sad. Since it was totally expected, the award went to theorists — some experimentalists might not be too thrilled.) Just look at the recent list: 2010, graphene (shouldn’t that be chemistry? if material science can be part of physics, then chemistry must surely encompass it, too); 2009, CCD sensor (whatever that means, maybe that’s important); 2008, fibers (okay, I love fast Internet connections). The list actually goes all the way down to early 20th century, but it’s much denser in recent decades. Now one more: 2014, LED.
diff --git a/source/blog/2014-11-07-interstellar.md b/source/blog/2014-11-07-interstellar.md
index 3e7a576c..43bc5b3e 100644
--- a/source/blog/2014-11-07-interstellar.md
+++ b/source/blog/2014-11-07-interstellar.md
@@ -2,7 +2,8 @@
title: "Interstellar"
date: 2014-11-07T23:56:31-0800
date_display: November 7, 2014
----
+...
+
Today (I mean November 7, 2014 — it’s technically November 8 at the time of writing) I saw [*Interstellar*](https://en.wikipedia.org/wiki/Interstellar_%28film%29) (IMAX digital) at AMC Mercado 20. I rarely go to movie theaters, less on the release day (film formats of *Interstellar* were released on November 5, and digital formats followed on November 7). However, reviews of it were positive (from the physics community), and I really need a way to release stress these days — I wasn’t in the right condition for months. So I figured I’d just spend an afternoon in front of the big screen.
I’ve heard good things about IMAX 70mm film, like no trailers, among other things. But I didn’t bother the extra seven miles’ drive to Hackworth IMAX Dome, so I landed on IMAX digital. Still a pretty stunning experience, although I ended up watching forty minutes worth of trailers before the real thing (arrived fifteen minutes early). In hindsight maybe I’d be better off spending some extra time on the road.
diff --git a/source/blog/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md b/source/blog/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md
index ceb6f034..4768afcc 100644
--- a/source/blog/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md
+++ b/source/blog/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md
@@ -2,7 +2,8 @@
title: "Average phone plan in the U.S. costs ten time as much as that in the U.K."
date: 2014-11-10T11:11:46-0800
date_display: November 10, 2014
----
+...
+
To quote [Opera News](http://blogs.opera.com/news/2014/11/mobile-data-anyway/),
> According to research by the International Telecommunication Union, the average phone plan with 500MB of data costs $85 in the United States, compared to $24.10 in China and $8.80 in the United Kingdom.
diff --git a/source/blog/2014-11-11-re-encoding-everything-for-iphone-6-plus.md b/source/blog/2014-11-11-re-encoding-everything-for-iphone-6-plus.md
index 75992541..9dd1d84a 100644
--- a/source/blog/2014-11-11-re-encoding-everything-for-iphone-6-plus.md
+++ b/source/blog/2014-11-11-re-encoding-everything-for-iphone-6-plus.md
@@ -2,5 +2,6 @@
title: "Re-encoding everything for iPhone 6 Plus"
date: 2014-11-11T13:31:25-0800
date_display: November 11, 2014
----
+...
+
AT&T finally delivered my iPhone 6 Plus (silver, 64 GB) after about fifty days since preorder… The 1080p Retina display is simply stunning. However, it turns out that my old videos don’t work so well on 6 Plus’s giant screen. My old mobile video collection was optimized for my 16 GB 4S, targeting the small screen and highly limited storage — you guessed it, they were resized to 960x540, and they looked great. But they’re not up to the task any more. 960x540 videos aren’t at all sharp on the stunning screen of 6 Plus, which is more than capable of handling 4x pixels. Therefore, I have no choice but to feed it more pixels. I’m left in a weird situation, where my 1080p desktop (or even HDTV) quality videos should fit the screen just fine, but H.264 profile stands in the way. iPhone 6 and 6 Plus are only capable of High Profile level 4.2, so anything encoded in level 5.1, for instance, needs to be re-encoded. Also there are still MPEG-2 and MPEG-4 videos out there (MPEG-4 should be obsolete by now, I assume, but some people still use it; and MPEG-2 is de facto in TV broadcasts), which have to be transcoded. Okay, it’s a daunting task to re-encode a fairly big collection, but I have to do it sooner or later. Presumably this weekend. I’ll also report whether 720p videos look sharp on the screen later.
diff --git a/source/blog/2014-11-19-convolution-of-irreducible-characters.md b/source/blog/2014-11-19-convolution-of-irreducible-characters.md
index f1ef9391..27629d40 100644
--- a/source/blog/2014-11-19-convolution-of-irreducible-characters.md
+++ b/source/blog/2014-11-19-convolution-of-irreducible-characters.md
@@ -2,7 +2,8 @@
title: "Convolution of irreducible characters"
date: 2014-11-19T20:40:37-0800
date_display: November 19, 2014
----
+...
+
__*TL; DR:* The actual PDF write-up is [here](https://dl.bintray.com/zmwangx/generic/20141119-convolution-of-irreducible-characters.pdf).__
---
diff --git a/source/blog/2014-11-20-dropbot-for-geeks(r).md b/source/blog/2014-11-20-dropbot-for-geeks(r).md
index 77d163cb..1d259046 100644
--- a/source/blog/2014-11-20-dropbot-for-geeks(r).md
+++ b/source/blog/2014-11-20-dropbot-for-geeks(r).md
@@ -2,7 +2,8 @@
title: "Dropbot for Geeks®"
date: 2014-11-20T09:48:15-0800
date_display: November 20, 2014
----
+...
+
I propose the following cloud storage and syncing service model of the future. I call it **Dropbot for Geeks®**, and it totally rules. It's designed for geeks who are tired of the highly limited, miserably unproductive traditional services (based on clicking around). It has the following features:
* Standard Unix file system commands exposed as an API, e.g., `cat`, `cd`, `cp`, `du`, `df`, `file`, `find`, `head`, `ln`, `ls`, `mkdir`, `mv`, `pwd`, `rm`, `rmdir`, `tail`, `touch`, etc.
diff --git a/source/blog/2014-11-24-iphone-photography-frustration.md b/source/blog/2014-11-24-iphone-photography-frustration.md
index 33ae40d4..1e6d0cf6 100644
--- a/source/blog/2014-11-24-iphone-photography-frustration.md
+++ b/source/blog/2014-11-24-iphone-photography-frustration.md
@@ -2,7 +2,8 @@
title: "iPhone photography frustration"
date: 2014-11-24T12:42:25-0800
date_display: November 24, 2014
----
+...
+
**TL; DR:** Jump to the paragraph “In the end…”
---
diff --git a/source/blog/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md b/source/blog/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md
index 7e5d7fa4..8a4a91b3 100644
--- a/source/blog/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md
+++ b/source/blog/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md
@@ -2,7 +2,8 @@
title: "Why I abandoned MathJax and fell back to PDF"
date: 2014-11-24T20:54:36-0800
date_display: November 24, 2014
----
+...
+
Recently I wrote an expository article, [*Convolution of irreducible characters*](/pdf/20141119-convolution-of-irreducible-characters.pdf), and posted it [here](/blog/2014-11-19-convolution-of-irreducible-characters.html). At first I intended to use MathJax, but in the end I fell back to good ol' PDF. Here's why.
In short, I'm a mathematician. I write math *articles*, not just standalone expressions or formulas. I use AMSLaTeX to its fullest (not really, but at least I use numbering and the `amsthm` package to its fullest). HTML simply wasn't designed for this. Here are two influential markup languages designed for totally different use cases, and bridging them is painful. I tried to use `pandoc`, but it doesn't support `\input`, doesn't support `\def`, and swallows `\begin{theorem} \end{theorem}`, among other things. I tried to use `htlatex`; even the MathML output is suboptimal, with many math symbols translated to non-math (apart from totally human-unreadable), and it uses its custom CSS files that don't play well with everything else. I tried other things. In the end I gave up. Maybe I don't know enough about MathJax, but I certainly don't want to write a translator myself. Leave LaTeX alone. Distribute as PDF. MathJax may be great for Wikis (like Wikipedia) and for math lite blogs, but it's no replacement for real, beefy LaTeX. It's not for mathematicians who want to distribute real articles.
diff --git a/source/blog/2014-11-25-i-got-16-gigs-of-ram.md b/source/blog/2014-11-25-i-got-16-gigs-of-ram.md
index 75410054..d30a47f5 100644
--- a/source/blog/2014-11-25-i-got-16-gigs-of-ram.md
+++ b/source/blog/2014-11-25-i-got-16-gigs-of-ram.md
@@ -2,7 +2,8 @@
title: "I got 16 gigs of RAM"
date: 2014-11-25T16:28:30-0800
date_display: November 25, 2014
----
+...
+
Today I upgraded the RAM of my MacBook Pro mid-2012 to 2x8GB. I purchased the [Crucial 16GB Kit (8GBx2) DDR3/DDR3L 1600 MHz (PC3-12800) CL11 SODIMM 204-Pin 1.35V/1.5V Memory for Mac CT2K8G3S160BM](http://smile.amazon.com/dp/B008LTBJFW) from Amazon, which cost me $146.64 after tax. I followed the [official guide](http://support.apple.com/en-us/HT201165) as well as the [iFixit guide](https://www.ifixit.com/Guide/MacBook+Pro+13-Inch+Unibody+Mid+2012+RAM+Replacement/10374). To finish the job I needed a Phillips #00 screwdriver and a spudger, so I purchased the [spudger](https://www.ifixit.com/Store/Tools/Spudger/IF145-002) and the [54 bit driver kit](https://www.ifixit.com/Store/Tools/54-Bit-Driver-Kit/IF145-022-1) from iFixit.
The actual process was pretty simple. I had a little bit of hard time pulling out the bottom module and pushing in the top module, but overall it was smooth. The only stupid thing I did was that I forgot to push the battery connector back in before I closed the case; I only realized this when I was screwing in the eighth screw (that was a close one!), and had to unscrew everything again.
diff --git a/source/blog/2014-11-26-original-images-in-day-one-journal.md b/source/blog/2014-11-26-original-images-in-day-one-journal.md
index b38e5e03..b852f4d7 100644
--- a/source/blog/2014-11-26-original-images-in-day-one-journal.md
+++ b/source/blog/2014-11-26-original-images-in-day-one-journal.md
@@ -2,7 +2,8 @@
title: "Original images in Day One journal"
date: 2014-11-26T00:22:16-0800
date_display: November 26, 2014
----
+...
+
**TL; DR:** Jump to the paragraph beginning with “workaround”.
---
diff --git a/source/blog/2014-11-28-given-infinite-time.md b/source/blog/2014-11-28-given-infinite-time.md
index a37c287b..102270bd 100644
--- a/source/blog/2014-11-28-given-infinite-time.md
+++ b/source/blog/2014-11-28-given-infinite-time.md
@@ -2,5 +2,6 @@
title: "Given infinite time"
date: 2014-11-28T00:18:19-0800
date_display: November 28, 2014
----
+...
+
Given infinite time. There's so much I can do *given infinite time*. I don't think I'll ever be bored. But sadly the time assigned to each human being is finite. Actually it's epsilon, epsilon approaching zero. Sadly.
diff --git a/source/blog/2014-11-28-going-diceware.md b/source/blog/2014-11-28-going-diceware.md
index d9dfb860..e2d2b06c 100644
--- a/source/blog/2014-11-28-going-diceware.md
+++ b/source/blog/2014-11-28-going-diceware.md
@@ -2,7 +2,8 @@
title: "Going Diceware"
date: 2014-11-28T19:05:59-0800
date_display: November 28, 2014
----
+...
+
Today I'm officially going [Diceware](http://world.std.com/~reinhold/diceware.html). I published my simple C implementation of diceware on [GitHub](https://github.com/zmwangx/diceware).
I've been using 1Password for a couple years now, and I've always been a bit worried about my master password. It's a ~30 byte monster with uppercase, lowercase letters, numbers, and special symbols. By any measure it is very safe. The problem is there are (extremely) personal things in there. I assembled several unrelated things that I (secretly) hold dearest to my heart, obfuscated them with rules not found in best64, and mixed with semi-gibberish. My daily login password is a combo similar in nature, with less obfuscation to facilitate typing. People who dig really deep into my identity might be able to compromise it (or not); I'm afraid that I'm more predictable than I thought I was. I know, the worry is pretty much unwarranted, as I’m not likely the target of a focused attack — I’m neither rich nor equipped with sensitive information or power, and for wide-range exploits, 99.9% of people are lower-hanging fruits. Even for a targeted attack, [xkcd 538: Security](http://xkcd.com/538/) broke a crypto nerd’s imagination with a $5 wrench. However, a geek is a geek, you can’t block a geek’s imagination.
diff --git a/source/blog/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md b/source/blog/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md
index 7e7bd933..e757f37c 100644
--- a/source/blog/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md
+++ b/source/blog/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md
@@ -2,7 +2,8 @@
title: "Opera-style advanced keyboard shortcuts in Safari"
date: 2014-11-30T17:20:20-0800
date_display: November 30, 2014
----
+...
+
I've been using the Chromuim Opera for a long time, after Chrome's design went unbearably ugly around v32 (IIRC Opera stable channel was on v19 when I switched, which was released on January 28, 2014). From then on, Opera's [advanced keyboard shortcuts](http://help.opera.com/opera/Mac/1583/en/fasterBrowsing.html#advanced) has become an integral part of my browsing habit. In particular, the following are especially handy for me:
* `1`: Cycle left through tabs;
diff --git a/source/blog/2014-12-05-distraction-free-writing.md b/source/blog/2014-12-05-distraction-free-writing.md
index 2c25aed6..5b1f80ce 100644
--- a/source/blog/2014-12-05-distraction-free-writing.md
+++ b/source/blog/2014-12-05-distraction-free-writing.md
@@ -2,7 +2,8 @@
title: "Distraction free writing"
date: 2014-12-05T21:09:10-0800
date_display: December 5, 2014
----
+...
+
This is not the first time that a distraction free writing app is featured on the Mac App Store. This time the candidate is [Desk](https://itunes.apple.com/us/app/desk/id915839505?mt=12). The official website is [here](http://desk.pm), but licensing is MAS-exclusive. The icon looks like this:
![The icon of Desk](https://i.imgur.com/OprXSEU.png)
diff --git a/source/blog/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md b/source/blog/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md
index 6642ae09..45c430cd 100644
--- a/source/blog/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md
+++ b/source/blog/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md
@@ -2,7 +2,8 @@
title: "OmniFocus: change sync behavior, Mac and iOS"
date: 2014-12-10T22:45:34-0800
date_display: December 10, 2014
----
+...
+
On OS X, the following URIs are relevant:
* <a href="omnifocus:///change-preference?MaximumTimeBetweenSync=30">omnifocus:///change-preference?MaximumTimeBetweenSync=30</a>
diff --git a/source/blog/2014-12-13-the-mac-like-evernote.md b/source/blog/2014-12-13-the-mac-like-evernote.md
index 1a874153..810db627 100644
--- a/source/blog/2014-12-13-the-mac-like-evernote.md
+++ b/source/blog/2014-12-13-the-mac-like-evernote.md
@@ -2,7 +2,8 @@
title: "The Mac-like Evernote"
date: 2014-12-13T21:47:31-0800
date_display: December 13, 2014
----
+...
+
Once in a while (maybe a year, maybe several months — not set in stone), I give big name free services not in use a chance to convince me. Evernote is one such service. The interface used to look very cheap and cluttered. I hated it. However, this time I'm sold. Now everything Evernote, from its Mac app to its iOS app to its web design to its physical products, looks distinctively Mac-like. (I use Mac-like to refer to Apple's design philosophy, including iOS. Well, I guess the Android and Windows apps aren't Mac-like.) I mean, just look at the screenshots:
![Web UI, beta](https://i.imgur.com/AZelofm.png)
diff --git a/source/blog/2014-12-14-speeding-up-emacs-with-emacsclient.md b/source/blog/2014-12-14-speeding-up-emacs-with-emacsclient.md
index c5eafb27..4698fb68 100644
--- a/source/blog/2014-12-14-speeding-up-emacs-with-emacsclient.md
+++ b/source/blog/2014-12-14-speeding-up-emacs-with-emacsclient.md
@@ -2,7 +2,8 @@
title: "Speeding up Emacs with emacsclient"
date: 2014-12-14T10:06:02-0800
date_display: December 14, 2014
----
+...
+
Emacs is notorious for its loading time. For me, this is especially annoying when I'm editing LaTeX files — AUCTeX takes about five seconds to load, and once I exit Emacs (especially after a quick edit), all that work is wasted, and next time I want to do some quick editing with that same LaTeX file — sorry, another five seconds.
This problem can be solved by "using that same Emacs", i.e., running Emacs in server mode, then connecting to the server via `emacsclient`. Below is my script, which I call `emc`, to make `emacsclient` more user-friendly. `emc` opens a file (given as `$1`) on the server, launching one on its way if none is detected. Note that I used `-cqta=` for `emacsclient`. The `-c` option is `--create-frame`, i.e., create a new frame (in the current tty, for instance) instead of using the existing frame (in another tty, for instance); this allows for multiple frames accross different ttys. The `-q` option is for `--quiet`, suppressing messages like "Waiting for Emacs..." The `-t` option is for `--tty`, or equivalently, the familiar `-nw` option of `emacs`. The `-a=` options is `--alternate-editor=`; according to the manpage, `-a, --alternate-editor=EDITOR` has the following effect:
diff --git a/source/blog/2014-12-14-the-google-chrome-comic-a-classic.md b/source/blog/2014-12-14-the-google-chrome-comic-a-classic.md
index 6a7cf0d7..f258de5a 100644
--- a/source/blog/2014-12-14-the-google-chrome-comic-a-classic.md
+++ b/source/blog/2014-12-14-the-google-chrome-comic-a-classic.md
@@ -2,7 +2,8 @@
title: "The Google Chrome Comic — A classic"
date: 2014-12-14T17:42:55-0800
date_display: December 14, 2014
----
+...
+
I was cleaning up my Opera bookmarks just now — I'm semi-officially leaving Opera for Safari. Of course, Safari still can't handle everything (e.g., Adblock Plus is still not so good on Safari, YouTubeCenter lags behind and I don't bother to compile myself — yes, I have a certificate, and some power user features simply don't exist), so I'm still going to Opera/Opera beta/Chrome/Firefox for certain tasks. But Safari is very nice. For the first time.
I started out as a Chrome user (well, don't want to recall the IE days), branched out to the Chromium Opera, and now ended up in Safari. Not sure about the future. When I look back, something nostalgic pops up in mind — [the Google Chrome Comic](http://www.google.com/googlebooks/chrome/). I enjoyed it more than once, but I never seemed to have archived it. So here it is, combined into [one PDF](https://dl.bintray.com/zmwangx/generic/2008-chrome-comic.pdf). In fact, you can create the PDF yourself:
diff --git a/source/blog/2014-12-19-app-suggestion-dropzone-3.md b/source/blog/2014-12-19-app-suggestion-dropzone-3.md
index 9609a91b..1a832fee 100644
--- a/source/blog/2014-12-19-app-suggestion-dropzone-3.md
+++ b/source/blog/2014-12-19-app-suggestion-dropzone-3.md
@@ -2,7 +2,8 @@
title: "App suggestion: Dropzone 3"
date: 2014-12-19T14:08:57-0800
date_display: December 19, 2014
----
+...
+
I recently tried and purchased [Dropzone 3](https://aptonic.com/dropzone3/). See a list of features on the linked official website. In short, Dropzone 3 provides an intermediate zone for drag-n-drop. You can use it as a stash (called "Drop Bar" — stacking is available), use it as a shortcut by putting frequently used folders and applications there, or trigger actions by dropping. There are a dozen builtin actions and [an additional list of readily available actions](https://aptonic.com/dropzone3/actions/), covering common web drives, SNS and file sharing sites. **Better yet, you can develop your custom actions with the easy-to-use [Ruby API](https://github.com/aptonic/dropzone3-actions/blob/master/README.md#dzalerttitle-message).** For instance, I wrote a simple Google Translate action, `Google Translate.dzbundle` ([link](https://gist.github.com/zmwangx/b27f106a8ba47468a43d)), based on [translate-shell](https://github.com/soimort/translate-shell). (You know, it's Ruby, so calling external commands and concatenating strings feel at home, as if you are coding in Perl or directly in shell; unlike Python, where you at least need to `import subprocess` then `subprocess.check_output` to get the output of an external command, and have to use a bunch of stupid `+`'s to get your goddamn message to print.)
Although I use the terminal for most tasks, drag-n-drop is still useful and convenient at times, not to mention the custom actions. (And the stock drag-n-drop is kinda hit-and-miss, especially for people like me who are mostly working with windows maximized — except terminal windows.) After using Dropzone 3 for a while, I found it well worth $4.99.
diff --git a/source/blog/2014-12-22-10k-images-on-imgur.md b/source/blog/2014-12-22-10k-images-on-imgur.md
index 103341d4..a8c3c8f3 100644
--- a/source/blog/2014-12-22-10k-images-on-imgur.md
+++ b/source/blog/2014-12-22-10k-images-on-imgur.md
@@ -2,5 +2,6 @@
title: "10k images on imgur"
date: 2014-12-22T12:42:16-0800
date_display: December 22, 2014
----
+...
+
I happened to check my imgur account just now (haven't been to the web interface for ages), and you know what, I have uploaded 10,744 images since I created the account in February this year! (I've been using imgur for longer than that; previously I uploaded images anonymously.) Most of the 10k images were uploaded via scripts using the API. This again demonstrates the importance of a good API — without the imgur API I wouldn't have been able to upload hundreds of images with a few keystrokes all in a snap, and getting links would be a huge pain in the ass. There are myriad image hosting services out there, but imgur rules 'em all, thanks to its decent API (and also its good CDN and direct image links, of course).
diff --git a/source/blog/2014-12-23-mpv-launcher.md b/source/blog/2014-12-23-mpv-launcher.md
index 41382d69..ad3bfbf1 100644
--- a/source/blog/2014-12-23-mpv-launcher.md
+++ b/source/blog/2014-12-23-mpv-launcher.md
@@ -2,7 +2,8 @@
title: "mpv launcher"
date: 2014-12-23T00:51:05-0800
date_display: December 23, 2014
----
+...
+
**_04/06/2015 update:_**
I just noticed that `daemonize` doesn't play too well with the OS; in particular, when you use dark menu bar on OS X Yosemite, apps launched with `daemonize` won't conform to that. So a native shell solution would be using `/bin/zsh` and run
diff --git a/source/blog/2015-01-01-os-x-system-ruby-encoding-annoyance.md b/source/blog/2015-01-01-os-x-system-ruby-encoding-annoyance.md
index d7f35d5c..d2f2ac06 100644
--- a/source/blog/2015-01-01-os-x-system-ruby-encoding-annoyance.md
+++ b/source/blog/2015-01-01-os-x-system-ruby-encoding-annoyance.md
@@ -2,7 +2,8 @@
title: "OS X system ruby encoding annoyance"
date: 2015-01-01T22:49:39-0800
date_display: January 1, 2015
----
+...
+
I've been using RVM (with fairly up-to-date Rubies) and pry since my day one with Ruby (well, almost), so it actually surprises me today when I found out by chance how poorly the system Ruby behaves when it comes to encoding.
The major annoyance with the current system Ruby (2.0.0p481) is that it can't convert `UTF8-MAC` to `UTF-8` (namely, NFD to NFC, as far as I can tell), at least not with Korean characters. Consider the following script:
diff --git a/source/blog/2015-01-10-fonts-why-chinese-web-design-is-hard.md b/source/blog/2015-01-10-fonts-why-chinese-web-design-is-hard.md
index 13e91cd7..ed086d26 100644
--- a/source/blog/2015-01-10-fonts-why-chinese-web-design-is-hard.md
+++ b/source/blog/2015-01-10-fonts-why-chinese-web-design-is-hard.md
@@ -2,7 +2,8 @@
title: "Fonts: why Chinese web design is hard"
date: 2015-01-10T09:30:02-0800
date_display: January 10, 2015
----
+...
+
For years I've been complaining about Chinese websites' horrendous designs. Yesterday I tried to translate one of my simple project websites to Chinese, and finally realized that web design for the Chinese language is no simple task — much harder than for English. The problem is fonts. This might not be the only problem (and cannot take blame for all the horrendous designs), but it certainly seems to be a roadblock.
The problem with fonts boils down to the fact that the Chinese writing system has too many glyphs. I still remember learning things about the GB 2312 charset when I was twelve — there are 3755 Level 1 characters (more commonly seen), 3008 Level 2 characters, and other symbols and foreign glyphs. Designing more than six thousand Chinese characters is so much harder than designing 26 letters. I'm not sure if many glyphs are auto-generated from parts, but that would certainly degrade the quality. The result? Availability of digital fonts suffers. There are simply not so many choices of Chinese fonts. Chinese writing is beautiful, but I've yet to see a font for screens (let alone the web) that conveys that beauty. This might be subjective, but I have the impression that fonts generally look worse on screen than in print, and more so for Chinese fonts (Retina doesn't help much). For the record, I checked Apple's font usage at the moment, and they are using a tailored font named "PingHei" ("平黑", I guess; see screenshot at the end); I'm not at all impressed. Compare that to the English counterpart (also at the end) — not on the same level. (I won't talk about Microsoft since it doesn't feature a design department, or that department is brain dead. Well, I'm a little opinionated.)
diff --git a/source/blog/2015-01-21-web-design-microsoft-vs-apple.md b/source/blog/2015-01-21-web-design-microsoft-vs-apple.md
index 82078dda..7a7e619e 100644
--- a/source/blog/2015-01-21-web-design-microsoft-vs-apple.md
+++ b/source/blog/2015-01-21-web-design-microsoft-vs-apple.md
@@ -2,7 +2,8 @@
title: "Web design: Microsoft vs Apple"
date: 2015-01-21T16:30:51-0800
date_display: January 21, 2015
----
+...
+
I just had a look at Ars's live blog on today's Windows 10 Event to acquire a sense of where Windows is heading. There's not much to report. Safari rip-off (Microsoft's new Spartan — wait, is this name also inspired by Safari? — features reading mode and offline reading list, Safari's killer features) aside, the focus seems to be virtual assistant, PC-tablet-phone integration, and gaming, none of which I'm interested in. The hologram thing does look cool, but putting the hype aside, I doubt if it will be really useful for the masses (except probably in gaming, one of my most despised applications of computing). I'm not a visionary so maybe I'm underestimating this.
(Another interesting development is "Windows as a Service" — WaaS? Microsoft isn't communiating it effectively. If it means paid subscription, am I ever going to subscribe to an OS? No. If it instead means free system updates for the lifetime of a device, then this WaaS thing is just a vacuous buzz phrase — Apple has already been doing it for two years. Longer if you count the cheap upgrades. However, if free system updates is indeed the case, then what about VMs? Not sure.)
diff --git a/source/blog/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md b/source/blog/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md
index 24cad7c3..9a8c53b1 100644
--- a/source/blog/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md
+++ b/source/blog/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md
@@ -2,7 +2,8 @@
title: "Monitor progress of your Unix pipes with pv"
date: 2015-02-10T02:18:30-0800
date_display: February 10, 2015
----
+...
+
Recently I found a very useful utility called `pv` (for "pipe viewer"). [Here](http://www.ivarch.com/programs/pv.shtml) is its home page, and it can be easily installed with `brew`. According to its man page,
> `pv` shows the progress of data through a pipeline by giving information such as time elapsed, percentage completed (with progress bar), current throughput rate, total data transferred, and ETA.
diff --git a/source/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md b/source/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md
index 6a33e176..811e2de6 100644
--- a/source/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md
+++ b/source/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md
@@ -2,7 +2,8 @@
title: "Microsoft is getting cool (but not its website)"
date: 2015-02-17T18:57:19-0800
date_display: February 17, 2015
----
+...
+
Microsoft is getting kind of cool. For instance, open sourcing .NET last year caused quite a buzz. Ars has a good piece about this: [Microsoft’s continuing efforts to be cool](http://arstechnica.com/information-technology/2015/02/microsofts-continuing-efforts-to-be-cool/).
Three weeks ago Microsoft made another minor but totally unexpected move: they integrated AgileBits' `onepassword-app-extension` ([GitHub](https://github.com/AgileBits/onepassword-app-extension)) into the 5.0 release of the OneDrive iOS app. I didn't realize this until I read [yesterday's blog post on the OneDrive Blog](https://blog.onedrive.com/onedrive_secure_password/). This is really amazing when you put it in context: I mean, take a look at [Apps that love 1Password](https://blog.agilebits.com/1password-apps/), i.e., apps that have integrated that extension. Out of the ninety apps listed to date, there are only a dozen apps that I've heard of, and the only brands bigger than 1Password are Microsoft, Tumblr, Uber (infamous), and Walmart (what?). Microsoft embracing third party is surely an interesting phenomenon.
diff --git a/source/blog/2015-02-20-my-dock-and-updated-omnifocus.md b/source/blog/2015-02-20-my-dock-and-updated-omnifocus.md
index 4f4a996b..603015b5 100644
--- a/source/blog/2015-02-20-my-dock-and-updated-omnifocus.md
+++ b/source/blog/2015-02-20-my-dock-and-updated-omnifocus.md
@@ -2,7 +2,8 @@
title: "My dock and updated OmniFocus"
date: 2015-02-20T16:16:10-0800
date_display: February 20, 2015
----
+...
+
> Simplicity is the ultimate sophistication.
diff --git a/source/blog/2015-02-21-all-is-not-lost.md b/source/blog/2015-02-21-all-is-not-lost.md
index e9114183..279f17ff 100644
--- a/source/blog/2015-02-21-all-is-not-lost.md
+++ b/source/blog/2015-02-21-all-is-not-lost.md
@@ -2,7 +2,8 @@
title: "All is not lost"
date: 2015-02-21T17:12:32-0800
date_display: February 21, 2015
----
+...
+
Lubos Motl always attacks the Many-Worlds Interpretation as if it is on the same level as anti-scientific claims. He even went on to attack Hugh Everett (the guy who first formulated this interpretation) personally; *ad hominem* is of course typical Motl shit, and I don't bother to find those posts. Anyway, here's yet another one: [Many worlds: a Rozali-Carroll exchange](http://motls.blogspot.com/2015/02/many-worlds-rozali-carroll-exchange.html).
Disclaimer: I'm not really a proponent of Many-Worlds, at least not of the part of it that says history really *branches* into *many* worlds. Well, Lubos is at least right about one thing: "many worlds", taken literally, can't even be well-defined. However, I do believe that the world is can be described by a "universal wavefunction" (I prefer to call it the "universal state vector") in some gargantuan Hilbert space. And the universal state vector has to evolve deterministically. The reason is simple: **_all information is not lost_**. This principle is fundamental to physics and it's simply not on the same level as falsifiability, which is little more than a philosopher's toy and a nice thing to have. In quantum mechanics' terms, *unitarity must be respected*; this is why the Copenhagen Interpretation, or at least the wavefunction-collapsing part of it, cannot hold up to serious scrutiny — no operator can ever collapse the wavefunction and break unitarity. Those who hold the Copenhagen Interpretation are confusing *their* lack of knowledge (albeit a fundamental one, as they were entangled into the system when they make an observation) with the fundamental loss of information (which is not possible).
diff --git a/source/blog/2015-02-24-the-new-onedrive-api.md b/source/blog/2015-02-24-the-new-onedrive-api.md
index 9d685a9f..6ec0943b 100644
--- a/source/blog/2015-02-24-the-new-onedrive-api.md
+++ b/source/blog/2015-02-24-the-new-onedrive-api.md
@@ -2,7 +2,8 @@
title: "The new OneDrive API"
date: 2015-02-24T18:31:19-0800
date_display: February 24, 2015
----
+...
+
Microsoft released the new OneDrive API today. See the blog post announcement [here](https://blog.onedrive.com/the-new-onedrive-api/). One highlight is that [large file upload](http://onedrive.github.io/items/upload_large_files.htm) is now officially supported. Previously, large file upload was handled with a semi-official API using the BITS protocol; the only documentation was a [gist](https://gist.github.com/rgregg/37ba8929768a62131e85). Now it is handled through standard HTTP `POST`. With this major release, there's likely a lot of work to be done with [python-onedrive](https://github.com/mk-fg/python-onedrive). I have opened an issue: [mk-fg/python-onedrive#52 — New OneDrive API support](https://github.com/mk-fg/python-onedrive/issues/52).
Interestingly, the new OneDrive API doc is hosted on GitHub Pages — [onedrive.github.io](http://onedrive.github.io), rather than MSDN. Exactly a week ago I wrote a piece, "[Microsoft is getting cool (but not its website)](/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.html)". Looks like they are doing something about their website (or better put, their online identity), too.
diff --git a/source/blog/2015-03-22-back-up-os-x-app-icons.md b/source/blog/2015-03-22-back-up-os-x-app-icons.md
index 05d441ac..91edd01a 100644
--- a/source/blog/2015-03-22-back-up-os-x-app-icons.md
+++ b/source/blog/2015-03-22-back-up-os-x-app-icons.md
@@ -2,7 +2,8 @@
title: "Back up OS X app icons"
date: 2015-03-22T16:58:50-0700
date_display: March 22, 2015
----
+...
+
OS X application icons are valuable assets, and it's interesting to see how they evolve over time. This is especially the case when we upgraded to OS X 10.10 Yosemite, when Apple and many design-aware third party developers overhauled (mainly flattened) their icons.
However, we lose all the old icons when we do a major OS upgrade. Technically they still live in Time Machine backups, but those are a pain to pull out. Therefore, I wrote a script just now to back up app icons of all applications living in `/Applications` (including those symlinked to `/Applications`, e.g., apps installed through `brew cask`) and its level-one subdirectories, and `/System/Library/CoreServices` (for `Finder.app` and such). Here's the script:
diff --git a/source/blog/2015-04-26-using-python-3-with-emacs-jedi.md b/source/blog/2015-04-26-using-python-3-with-emacs-jedi.md
index a475a8bc..2f9899d6 100644
--- a/source/blog/2015-04-26-using-python-3-with-emacs-jedi.md
+++ b/source/blog/2015-04-26-using-python-3-with-emacs-jedi.md
@@ -2,7 +2,8 @@
title: "Using Python 3 with Emacs Jedi"
date: 2015-04-26T21:19:14-0700
date_display: April 26, 2015
----
+...
+
Recently I'm working on [a hobby project in Python](https://github.com/zmwangx/storyboard), which means editing Python source files a lot. I've been using [Emacs Jedi](https://github.com/tkf/emacs-jedi) for almost as long as I've been writing Python, and it has been pretty helpful at completing away long names.
However, Jedi uses `python` by default, which means `python2` on most of our systems at this point. Occasionally I'm writing Python 3 specific code but Jedi completes to Python 2 or refuses to complete; for the record, I enjoy writing and debugging Python 3.3+ much better than 2.7 (I realized this after trying to create a code base that is backward compatible with 2.7, which means reinventing the wheel or introducing annoying branches from time to time). So naturally I'm looking into using Python 3 in Jedi.
diff --git a/source/blog/2015-05-03-why-oh-my-zsh-is-completely-broken.md b/source/blog/2015-05-03-why-oh-my-zsh-is-completely-broken.md
index a7d29989..c449e7ef 100644
--- a/source/blog/2015-05-03-why-oh-my-zsh-is-completely-broken.md
+++ b/source/blog/2015-05-03-why-oh-my-zsh-is-completely-broken.md
@@ -2,7 +2,8 @@
title: "Why Oh My Zsh is completely broken"
date: 2015-05-03T17:15:49-0700
date_display: May 3, 2015
----
+...
+
Today I moved from [Oh My Zsh](https://github.com/robbyrussell/oh-my-zsh) to [Prezto](https://github.com/sorin-ionescu/prezto), after using Oh My Zsh for about three years since 2012. I'll try to shed some light on the reasons in this post.
Zsh is a rather complicated shell (compared to Bash), with a hell lot of builtins and a complex completion system. The complexity makes it powerful, but also makes it intimidating to mortals; moreover, it doesn't look as sweet as it could be out of box. Most mortals, me included, want an interactive shell that's sweet and "just works", so we need wizards to guide us in configuring this beast. Oh My Zsh and Prezto are just two of such configuration frameworks. Oh My Zsh is somewhat older: the first commit of Oh My Zsh dates back to [August 2009](https://github.com/robbyrussell/oh-my-zsh/commit/e20401e04e057a39c228dbb99dda68ec7fa4235a), while Prezto was forked from Oh My Zsh in [February 2011](https://github.com/sorin-ionescu/prezto/commit/8d487d4f6c2d38cb108d7c8c0c2de9f0385da402), and has since been completely rewritten. `robbyrussell/oh-my-zsh` as of today has 23,610 stars on GitHub, while `sorin-ionescu/prezto` has 4,069. This doesn't imply Oh My Zsh is any better — I guess the fancy name of Oh My Zsh earned it a lot more undeserved stars; you'll see why soon.
diff --git a/source/blog/2015-05-05-graceful-handling-of-sigint-when-using-pythons-multiprocessingprocess.md b/source/blog/2015-05-05-graceful-handling-of-sigint-when-using-pythons-multiprocessingprocess.md
index 6e0ca9b0..c5f1c915 100644
--- a/source/blog/2015-05-05-graceful-handling-of-sigint-when-using-pythons-multiprocessingprocess.md
+++ b/source/blog/2015-05-05-graceful-handling-of-sigint-when-using-pythons-multiprocessingprocess.md
@@ -2,7 +2,8 @@
title: "Graceful handling of <code>SIGINT</code> when using Python's <code>multiprocessing.Process</code>"
date: 2015-05-05T22:03:39-07:00
date_display: May 5, 2015
----
+...
+
Today I learned something about Python's (at least CPython's) multiprocessing and signal handling, and I would like to share it here. Basically my situation was such (when developing [`pydoc`](https://github.com/zmwangx/zmwangx.github.io/blob/source/pyblog) that powers this blog):
* I would like to serve the blog with an HTTP server while auto-regenerating for changes;
diff --git a/source/blog/2015-05-05-new-blog-new-start.md b/source/blog/2015-05-05-new-blog-new-start.md
index 2f077f9a..a0487d58 100644
--- a/source/blog/2015-05-05-new-blog-new-start.md
+++ b/source/blog/2015-05-05-new-blog-new-start.md
@@ -2,7 +2,8 @@
title: "New blog, new start"
date: 2015-05-05T02:42:44-07:00
date_display: May 5, 2015
----
+...
+
Octopress has been serving me for the past six months, during which even Octopress itself underwent major changes — in fact, [Octopress 3.0.0](https://github.com/octopress/octopress/releases/tag/v3.0.0) was only released 3 days ago, which I never got to try. Anyway, Octopress's heavily colored interface grew old on me fairly quickly. I'm especially unhappy with the inline `<code>` tag, which is always wrapped in a white box and stands out too much (worse still, there's no visual difference when such a `<code>` tag is placed inside an `<a>` tag). Since I use inline code/verbatim a lot, many of my articles were littered with arbitrary boxes everywhere.
![Farewell, Octopress.](https://i.imgur.com/hxfSnOk.png)
diff --git a/source/blog/2015-05-06-searchable-settings-are-one-honking-great-idea-lets-do-more-of-those.md b/source/blog/2015-05-06-searchable-settings-are-one-honking-great-idea-lets-do-more-of-those.md
index 72f5ee04..ac201266 100644
--- a/source/blog/2015-05-06-searchable-settings-are-one-honking-great-idea-lets-do-more-of-those.md
+++ b/source/blog/2015-05-06-searchable-settings-are-one-honking-great-idea-lets-do-more-of-those.md
@@ -2,7 +2,8 @@
title: "Searchable settings are one honking great idea — let's do more of those!"
date: 2015-05-06T19:29:46-07:00
date_display: May 6, 2015
----
+...
+
I had to tweak some iOS settings just now, which wasn't a delightful experience. Since I just renovated my blog inside out and am still in the hype mode, I'll write a post on the interface design of settings or preferences.
The Zen of Python says,
diff --git a/source/blog/2015-05-09-storyboard-reached-01.md b/source/blog/2015-05-09-storyboard-reached-01.md
index 3364d9aa..d90fefd2 100644
--- a/source/blog/2015-05-09-storyboard-reached-01.md
+++ b/source/blog/2015-05-09-storyboard-reached-01.md
@@ -2,7 +2,8 @@
title: "<code>storyboard</code> reached 0.1"
date: 2015-05-09T00:32:28-07:00
date_display: May 9, 2015
----
+...
+
For quite some time I've been working on a Python project called [`storyboard`](https://github.com/zmwangx/storyboard), and today I finally released the 0.1 stable (or you can think of it as 1.0).
As described on [the index page](https://storyboard.readthedocs.org/en/0.1/index.html),
diff --git a/source/blog/2015-05-19-bash-the-special-slash-character-in-filename-expansion.md b/source/blog/2015-05-19-bash-the-special-slash-character-in-filename-expansion.md
index 143a5f36..a3a789f9 100644
--- a/source/blog/2015-05-19-bash-the-special-slash-character-in-filename-expansion.md
+++ b/source/blog/2015-05-19-bash-the-special-slash-character-in-filename-expansion.md
@@ -2,7 +2,8 @@
title: "Bash: the special slash character in filename expansion"
date: 2015-05-19T18:33:51-07:00
date_display: May 19, 2015
----
+...
+
It is well-known and common sense that the slash character (`/`) serves a special role in Bash filename expansion. For instance, the asterisk `*` certainly won't match `/` or `.` when used in filename expansion; otherwise, a standalone `*` would match everything in the filesystem.
However, it is less clear how a literal slash character[^expansion] is treated in extended glob patterns. Naively one would expect it to just match a literal slash, but the real situtation is more complicated than that. Consider the following examples:
diff --git a/source/blog/2015-05-22-using-a-command-table-as-wallpaper.md b/source/blog/2015-05-22-using-a-command-table-as-wallpaper.md
index 6d2d5143..19aa30d6 100644
--- a/source/blog/2015-05-22-using-a-command-table-as-wallpaper.md
+++ b/source/blog/2015-05-22-using-a-command-table-as-wallpaper.md
@@ -2,7 +2,8 @@
title: "Using a command table as wallpaper"
date: 2015-05-22T00:48:19-07:00
date_display: May 22, 2015
----
+...
+
Recently I cleaned up my source code directory, removed a lot of rarely-used, dated scripts, and grouped the remaining standalone scripts into a central place (`~/dev/scripts`)[^dev]. One thing I learned in this process is that I tend to write a reusable script but rarely actually reuse it (even if it sits on `PATH`), sometimes implementing the same functionality twice or typing a long command line over and over again.
[^dev]: The `~/dev` directory stands for development, and contains all my source code and almost all local builds. The point is by having a `~/dev` directory, I no longer need to have `bin`, `include`, `lib`, and `share` in my `HOME`, thus saving a few slots. Backing up and restoring is also slightly easier.
diff --git a/source/blog/2015-05-29-apples-customer-service-is-still-the-best-plus-an-authy-horror-story.md b/source/blog/2015-05-29-apples-customer-service-is-still-the-best-plus-an-authy-horror-story.md
index 003ab394..55dfdafc 100644
--- a/source/blog/2015-05-29-apples-customer-service-is-still-the-best-plus-an-authy-horror-story.md
+++ b/source/blog/2015-05-29-apples-customer-service-is-still-the-best-plus-an-authy-horror-story.md
@@ -2,7 +2,8 @@
title: "Apple's customer service is still the best (plus an Authy horror story)"
date: 2015-05-29T20:40:05-07:00
date_display: May 29, 2015
----
+...
+
Recently the mute switch (officially known as the Ring/Silent switch) on my little-more-than-half-a-year-old iPhone 6 Plus stopped working. It almost always bounced back to ON (ring) position upon turning, and even if I could keep it at the OFF position for five seconds, it would most likely bounce back when I thrust it into my pocket. I got bitten a few times — almost got heart attacks when the phone dinged loudly in class. Minor yet annoying problem.
So I took my phone to the Genius Bar today, prepared to have it sent to a repair center[^repair-center] and get a loan in the mean time — basically, I was prepared for all sorts of trouble. But nope. I demoed the problem for three seconds, my agent explained to me in five seconds that the switch alone was hard to replace and took fifteen seconds to verify my warranty status (I suppose), then off he went to retrieve a brand new replacement for me. No questions asked about the little dent on my old phone or whatever. *So I ended up with a brand new phone in less than five minutes.* (Of course, redoing setup and restoring backup took much longer than that.)
diff --git a/source/blog/2015-05-30-using-a-personal-helper-package-in-everyday-scripting.md b/source/blog/2015-05-30-using-a-personal-helper-package-in-everyday-scripting.md
index 7bd23d75..4f5e8e0b 100644
--- a/source/blog/2015-05-30-using-a-personal-helper-package-in-everyday-scripting.md
+++ b/source/blog/2015-05-30-using-a-personal-helper-package-in-everyday-scripting.md
@@ -2,7 +2,8 @@
title: "Using a personal helper package in everyday scripting"
date: 2015-05-30T22:48:57-07:00
date_display: May 30, 2015
----
+...
+
Recently I've been scripting (mostly in Python) quite a bit, and noticed that some functionalities get copied over or reimplemented over and over again. Examples include reading configuration files (mostly JSON, INI, and YAML), printing progress information to tty in color, displaying progress bar, and so on.
In light of this, I came up with the idea of keeping a pool of helper modules in a personal helper package. I'm unimaginative at naming things, so I just named my package `zmwangx`. It is [published on GitHub](https://github.com/zmwangx/pyzmwangx), and the API docs are published on [Read the Docs](https://pyzmwangx.readthedocs.org) for easy reference during scripting.[^doc] At the time of writing the following helper modules are available in the package:
diff --git a/source/blog/2015-06-07-stackoverflow-review-system-is-completely-bs.md b/source/blog/2015-06-07-stackoverflow-review-system-is-completely-bs.md
index 7b0be5c3..6aef498a 100644
--- a/source/blog/2015-06-07-stackoverflow-review-system-is-completely-bs.md
+++ b/source/blog/2015-06-07-stackoverflow-review-system-is-completely-bs.md
@@ -2,7 +2,8 @@
title: "StackOverflow review system is completely BS"
date: 2015-06-07T18:58:57-07:00
date_display: June 7, 2015
----
+...
+
I just answered an interesting question about ZLE [on StackOverflow](http://stackoverflow.com/q/30699242/1944784), and in the process I also improved my own toolchain. For the record, the OP asked for tab completion to present working directory items (executable files and directories) on an empty command line, which led to the following widget:
```zsh
diff --git a/source/blog/2015-06-08-apple-turns-its-homepage-into-a-wwdc-liveblog.md b/source/blog/2015-06-08-apple-turns-its-homepage-into-a-wwdc-liveblog.md
index e6b2b232..024bbb06 100644
--- a/source/blog/2015-06-08-apple-turns-its-homepage-into-a-wwdc-liveblog.md
+++ b/source/blog/2015-06-08-apple-turns-its-homepage-into-a-wwdc-liveblog.md
@@ -2,7 +2,8 @@
title: "Apple turns its homepage into a WWDC liveblog"
date: 2015-06-08T14:42:50-07:00
date_display: June 8, 2015
----
+...
+
WWDC is Apple's biggest event every year, and WWDC keynote always attracts tons of hype. Apple knows that. In the past years folks who can't (at work, in class, etc.) or don't want to watch the crappy live stream would follow the various WWDC liveblogs presented by tech sites like Gizmodo, TechCrunch, Ars Technica, etc. But this year the landscape has changed: Apple rolled its own card-based liveblog at [www.apple.com/live/2015-june-event](http://www.apple.com/live/2015-june-event/).[^stream] Not only that; during the keynote, Apple redirected its homepage to the liveblog page, so it effectively turned its homepage into a liveblog:
diff --git a/source/blog/2015-06-10-chrome-disappointment-the-shabby-and-boring-old-bookmark-system-from-stone-age-strikes-back.md b/source/blog/2015-06-10-chrome-disappointment-the-shabby-and-boring-old-bookmark-system-from-stone-age-strikes-back.md
index 74339127..770cd570 100644
--- a/source/blog/2015-06-10-chrome-disappointment-the-shabby-and-boring-old-bookmark-system-from-stone-age-strikes-back.md
+++ b/source/blog/2015-06-10-chrome-disappointment-the-shabby-and-boring-old-bookmark-system-from-stone-age-strikes-back.md
@@ -2,7 +2,8 @@
title: "Chrome disappointment: the shabby and boring old bookmark system from Stone Age strikes back"
date: 2015-06-10T23:17:05-07:00
date_display: June 10, 2015
----
+...
+
I just restarted my machine (in the process of planning a fresh OS re-install), and something in Chrome's UI immediately felt wrong. After a few moments I realized it was the star button (bookmark button) in the far right of the omnibox giving me the uneasy feeling — the old bookmark system is back. Broadcasting from stable channel, build 43.0.2357.124 on OS X.
![What caught my immediate attention.](/img/20150610-omnibox-with-aged-star.png)
diff --git a/source/blog/2015-06-12-the-tip-of-the-iceberg.md b/source/blog/2015-06-12-the-tip-of-the-iceberg.md
index fc821857..55b78de6 100644
--- a/source/blog/2015-06-12-the-tip-of-the-iceberg.md
+++ b/source/blog/2015-06-12-the-tip-of-the-iceberg.md
@@ -2,7 +2,8 @@
title: "The tip of the iceberg"
date: 2015-06-12T14:24:18-07:00
date_display: June 12, 2015
----
+...
+
*__Disclaimer__: While this post might have been triggered by a [specific](https://twitter.com/search?q=%23distractinglysexy)[^not-shaming] campaign, I'm certainly not addressing any specific concern or siding with any party. I never bothered to learn enough about a specific campaign to form a judgement that I would stand by,[^judge] since I simply don't care. I'm writing this post because I'm just too tired to see them popping up in my feeds every once in a while.*
*By the way, I'm not sure if I'm going to stand by this post when I wake up tomorrow morning. It will stay either way, though.*
diff --git a/source/blog/2015-06-23-all-problems-solved.md b/source/blog/2015-06-23-all-problems-solved.md
index 3894246b..f3d162f7 100644
--- a/source/blog/2015-06-23-all-problems-solved.md
+++ b/source/blog/2015-06-23-all-problems-solved.md
@@ -2,7 +2,8 @@
title: "All problems solved!?"
date: 2015-06-23T21:47:07-07:00
date_display: June 23, 2015
----
+...
+
The project I've been working on intermittently over the past month, [`pyonedrive`](https://github.com/zmwangx/pyonedrive), a OneDrive API v1.0 API/CLI client, is now quite satisfactory in terms of its feature set[^1], so today I'm thinking about what I should work on next. Of course there's [a lot more I can do](https://github.com/zmwangx/pyonedrive/labels/enhancement), but what is done already encapsulates 95%+ of my daily usage; moreover, as everyone knows, refining an existing project is not as exciting as starting a new one and making something happen that is previously tedious or impossible.
[^1]: In fact it already exceeded my original expectations — `pyonedrive` started out as a [bare bones batch uploader](https://github.com/zmwangx/pyonedrive/blob/4d21308545ec1462c3892b9ca25300042f1ccb81/README.rst).
diff --git a/source/blog/2015-06-26-ios-9-searchable-settings.md b/source/blog/2015-06-26-ios-9-searchable-settings.md
index 6a3febf8..d7044975 100644
--- a/source/blog/2015-06-26-ios-9-searchable-settings.md
+++ b/source/blog/2015-06-26-ios-9-searchable-settings.md
@@ -2,7 +2,8 @@
title: "iOS 9: searchable Settings"
date: 2015-06-26T23:59:28-07:00
date_display: June 26, 2015
----
+...
+
Finally it's here. According to [MacRumors](http://www.macrumors.com/2015/06/26/hidden-features-in-ios-9-and-os-x-el-capitan/):
> Apple's introduced a wide range of feature additions and minor tweaks in iOS 9 that make some very useful improvements to iOS. For example, there's now a Notification Center widget that displays the battery life of connected devices like the Apple Watch, and **there's a search bar in the Settings app that lets you find a specific setting very quickly.**
diff --git a/source/blog/2015-06-27-automatically-clean-up-previous-mobile-applications.md b/source/blog/2015-06-27-automatically-clean-up-previous-mobile-applications.md
index 1ccab97c..81efdc04 100644
--- a/source/blog/2015-06-27-automatically-clean-up-previous-mobile-applications.md
+++ b/source/blog/2015-06-27-automatically-clean-up-previous-mobile-applications.md
@@ -2,7 +2,8 @@
title: 'Automatically clean up "Previous Mobile Applications"'
date: 2015-06-27T21:19:59-07:00
date_display: June 27, 2015
----
+...
+
iTunes keeps a "Previous Mobile Applications" folder of questionable value, which always annoys me. It eats into disk space and wastes syncing/backup cycles and bandwidth; you can easily find horror stories online about [100GB+ PMA folders](http://forums.macrumors.com/threads/5-years-of-deleted-iphone-apps-accumulated-in-my-itunes-library.1781676/#post-19749496). The value? You might be able to roll back to an earlier version, or restore an app pulled from the App Store. Really? I never had that need in my life[^disclosure]; have you? Worst of all, there should be a periodic clean up option — just like how deleted mail are automatically purged after one month, but the option is missing.
[^disclosure]: Full disclosure: unlike many people, I'm not very obsessed with my phone, and I only have about two dozen third-party apps.
diff --git a/source/blog/2015-06-29-dl-cmplnts-in-apple-news.md b/source/blog/2015-06-29-dl-cmplnts-in-apple-news.md
index 20c85703..595c6d05 100644
--- a/source/blog/2015-06-29-dl-cmplnts-in-apple-news.md
+++ b/source/blog/2015-06-29-dl-cmplnts-in-apple-news.md
@@ -2,7 +2,8 @@
title: "dl? cmplnts? in Apple News"
date: 2015-06-29T23:14:42-07:00
date_display: June 29, 2015
----
+...
+
I submitted this blog to Apple via [News Publisher](https://developer.apple.com/news-publisher/) a few days after the WWDC keynote, just to get a feel for the submission process. It was easy; basically I just needed to provide an [Atom 1.0](/atom.xml) or [RSS 2.0](/rss.xml) feed, both of which I already have anyway.[^care] I was told at the end of the submission process that my submission would be reviewed.
[^care]: Of course my content isn't really optimized for the Apple News format, but why would I care.
diff --git a/source/blog/2015-07-15-zsh-save-stdout-stderr-and-return-value-of-command-to-different-variables-without-temp-file.md b/source/blog/2015-07-15-zsh-save-stdout-stderr-and-return-value-of-command-to-different-variables-without-temp-file.md
index 32ca1ca5..69e1a6dd 100644
--- a/source/blog/2015-07-15-zsh-save-stdout-stderr-and-return-value-of-command-to-different-variables-without-temp-file.md
+++ b/source/blog/2015-07-15-zsh-save-stdout-stderr-and-return-value-of-command-to-different-variables-without-temp-file.md
@@ -2,7 +2,8 @@
title: "Zsh: save stdout, stderr, and return value of command to different variables (without temp file)"
date: 2015-07-15T09:21:47-07:00
date_display: July 15, 2015
----
+...
+
This is something worth sharing. The idea was based on [this SO answer](http://stackoverflow.com/a/18086548/1944784), and I cooked up this particular implementation to remove potential race conditions, with input from Mathias Fredriksson[^1]. See [mafredri/zsh-async#1](https://github.com/mafredri/zsh-async/issues/1), and in particular [this comment](https://github.com/mafredri/zsh-async/issues/1#issuecomment-121468958) for explanation.
```zsh
diff --git a/source/blog/2015-07-19-github-experimental-attachment-formats-pdf-docx-and-pptx.md b/source/blog/2015-07-19-github-experimental-attachment-formats-pdf-docx-and-pptx.md
index 57b6246d..58e64be9 100644
--- a/source/blog/2015-07-19-github-experimental-attachment-formats-pdf-docx-and-pptx.md
+++ b/source/blog/2015-07-19-github-experimental-attachment-formats-pdf-docx-and-pptx.md
@@ -2,7 +2,8 @@
title: "GitHub experimental attachment formats: PDF, DOCX and PPTX!?!"
date: 2015-07-19T21:58:01-07:00
date_display: July 19, 2015
----
+...
+
I was browsing [github/hub](https://github.com/github/hub), and noticed something funny in the issue tracker:
> Attach more than just images: Now you can attach PDF, **Word**, and **PowerPoint** files to your comments on Issues and Pull Requests. This experimental feature is only available to some repositories.[^bold]
diff --git a/source/blog/2015-07-25-dl-cmplntss-web-doesnt-suck.md b/source/blog/2015-07-25-dl-cmplntss-web-doesnt-suck.md
index a2c47fad..3644d056 100644
--- a/source/blog/2015-07-25-dl-cmplntss-web-doesnt-suck.md
+++ b/source/blog/2015-07-25-dl-cmplntss-web-doesnt-suck.md
@@ -2,7 +2,8 @@
title: "dl? cmplnts?'s web doesn't suck"
date: 2015-07-25T11:31:54-07:00
date_display: July 25, 2015
----
+...
+
I was reading [Les Orchard's *The Verge's web sucks*](http://blog.lmorchard.com/2015/07/22/the-verge-web-sucks/) just now, and inspired by his dignostics of his various daily reads, I also ran the performance meter on my very own blog. Fortunately, it doesn't suck[^firefox]:
> 13 requests, 77.88 KB, 0.84s.
diff --git a/source/blog/2015-07-30-the-sad-state-of-finder-on-el-capitan.md b/source/blog/2015-07-30-the-sad-state-of-finder-on-el-capitan.md
index c671667e..a8d49714 100644
--- a/source/blog/2015-07-30-the-sad-state-of-finder-on-el-capitan.md
+++ b/source/blog/2015-07-30-the-sad-state-of-finder-on-el-capitan.md
@@ -2,7 +2,8 @@
title: "The sad state of Finder on El Capitan"
date: 2015-07-30T23:59:09-07:00
date_display: July 30, 2015
----
+...
+
I was listening to [Accidental Tech Podcast E128](http://atp.fm/episodes/128) today, which discussed the implications of Rootless (i.e. System Integrity Protection) at quite some length.[^1] Which stirred up my old worries about the Finder — I was briefly concerned about TotalFinder immediately after Rootless was announced in WWDC, but was quickly reassured and forgot that concern after learning that Homebrew (i.e. `/usr/local`) isn't affected, which attracted more of my attention.
[^1]: It's interesting to listen to John Siracusa's take on the issue, by the way. I completely agree with him.
diff --git a/source/blog/2015-08-02-sync-chrome-bookmarks-with-safari-on-os-x.md b/source/blog/2015-08-02-sync-chrome-bookmarks-with-safari-on-os-x.md
index 4d140d04..974fff6d 100644
--- a/source/blog/2015-08-02-sync-chrome-bookmarks-with-safari-on-os-x.md
+++ b/source/blog/2015-08-02-sync-chrome-bookmarks-with-safari-on-os-x.md
@@ -2,7 +2,8 @@
title: "Sync Chrome bookmarks with Safari on OS X"
date: 2015-08-02T22:11:56-07:00
date_display: August 2, 2015
----
+...
+
**08/11/2015 Update:** I have taken down the project from GitHub since it's way too flaky. Guess I'll stick with manually clicking around then...
---
diff --git a/source/blog/2015-08-05-should-apple-split-up-itunes-on-os-x.md b/source/blog/2015-08-05-should-apple-split-up-itunes-on-os-x.md
index 59113e2e..13a1d5f3 100644
--- a/source/blog/2015-08-05-should-apple-split-up-itunes-on-os-x.md
+++ b/source/blog/2015-08-05-should-apple-split-up-itunes-on-os-x.md
@@ -2,7 +2,8 @@
title: "Should Apple split up iTunes on OS X?"
date: 2015-08-05T14:09:51-07:00
date_display: August 5, 2015
----
+...
+
These days everyone seems to be talking about how complicated iTunes is and how Apple should give it a clean-sheet rewrite. This is not new, but the argument has certainly intensified ever since the introduction of iCloud Photo Library and Apple Music. For one recent example, see [Don't order the fish](http://www.marco.org/2015/07/26/dont-order-the-fish) by Marco Arment. I was listening to John Gruber's [The Talk Show episode 127](https://daringfireball.net/thetalkshow/2015/07/29/ep-127) earlier today (a little bit late to the game, yeah), and the complexity argument was brought up yet again.
I just can't buy that argument. (Disclaimer: in this post I'm talking about UI/UX, not the backend.) Granted, there are many tabs in iTunes. There's one for music, one for movies, one for TV shows, one for podcasts, one for iOS apps, one for each iOS device currently connected via USB, and so on. You can hide some of them if you don't use them. And for each of these tabs there are probably subtabs, and occasionally a sidebar. This might sound rather intimidating to the faint-hearted, but if you really dive into iTunes, you'll find that 99% of the functionalities you'll ever need to find or organize your stuff are under four clicks away^[Just a rough estimate off the top of my head; please don't challenge me or hold me responsible.], and editing metadata (including batch editing) is pretty easy too. All in all, iTunes as it currently stands is both powerful (too many things on the plate, in some people's words) and not badly complicated, in the sense that you can certainly find your way around if you try. Some would argue that some of iTunes' features get shuffled into different places from version to version; yeah that's annoying, but in reality it usually takes less than five minutes to find all I need in a new version.
diff --git a/source/blog/2015-08-05-switching-to-capitalized-commit-messages.md b/source/blog/2015-08-05-switching-to-capitalized-commit-messages.md
index 04a018f5..f5815d41 100644
--- a/source/blog/2015-08-05-switching-to-capitalized-commit-messages.md
+++ b/source/blog/2015-08-05-switching-to-capitalized-commit-messages.md
@@ -2,7 +2,8 @@
title: "Switching to capitalized commit messages"
date: 2015-08-05T19:38:37-07:00
date_display: August 5, 2015
----
+...
+
This post is a note to self.
As a long time git user, I've always used lowercase commit messages (in the subject line). I never quite liked the idea of capitalized commit messages, which are seldom complete sentences (and they are never period-terminated). Similarly, I avoid capilatization like hell in comments, unless when I write complete sentences. By the way, there's a technical advantage of writing lowercase commit messages: I can easily tell my human-made commits from auto commits like merge and revert commits, because they always begin with a capitalized "Merge", "Revert", etc.
diff --git a/source/blog/2015-08-13-other-peoples-___.md b/source/blog/2015-08-13-other-peoples-___.md
index 6a8e583f..337897a8 100644
--- a/source/blog/2015-08-13-other-peoples-___.md
+++ b/source/blog/2015-08-13-other-peoples-___.md
@@ -2,5 +2,6 @@
title: "Other people's ___"
date: 2015-08-13T02:00:24-07:00
date_display: August 13, 2015
----
+...
+
Often enough we look at other people's ___ (fill in the blank here) and say wow, but more often than not when we actually get to lay our hands on it, we find it less than impressive or even super annoying, and end up having nothing to say but meh. For Zsh geeks, examples include other people's Zsh prompts<a href="https://github.com/chauncey-garrett/zsh-prompt-garrett" style="text-decoration: none">,</a> zsh-syntax-highlighting, and zsh-autosuggestions.
diff --git a/source/blog/2015-08-14-laymen.md b/source/blog/2015-08-14-laymen.md
index 15690e2f..e176370b 100644
--- a/source/blog/2015-08-14-laymen.md
+++ b/source/blog/2015-08-14-laymen.md
@@ -2,7 +2,8 @@
title: "Laymen"
date: 2015-08-14T18:32:13-07:00
date_display: August 14, 2015
----
+...
+
I always cringe when I see laymen discussing physics in comments sections of news websites. A typical situation: one commentator put together a sentence with all physics-sounding (kind of) terms he's ever heard of; the next commentator "agrees" with the previous one, adding something that sounds more reasonable (to folks who've never taken high school physics) but unfortunately violates the first law of thermodynamics; then yet another guy comes along and corrects both of the above in a pedagogic tone, with an argument that violates the second law of thermodymics...
I cringe even more when laymen discuss mathematics, but that's much rarer compared to physics.
diff --git a/source/blog/2015-08-20-i-installed-blockparty-and-the-only-thing-i-can-say-is-wow.md b/source/blog/2015-08-20-i-installed-blockparty-and-the-only-thing-i-can-say-is-wow.md
index 1b367b66..58355b61 100644
--- a/source/blog/2015-08-20-i-installed-blockparty-and-the-only-thing-i-can-say-is-wow.md
+++ b/source/blog/2015-08-20-i-installed-blockparty-and-the-only-thing-i-can-say-is-wow.md
@@ -2,7 +2,8 @@
title: "I installed BlockParty, and the only thing I can say is WOW"
date: 2015-08-20T20:58:55-07:00
date_display: August 20, 2015
----
+...
+
**09/18/2015 update.** Okay, [Peace has been pulled](http://www.marco.org/2015/09/18/just-doesnt-feel-good). Guess I'll keep using it for a while, though.
---
diff --git a/source/blog/2015-08-20-ios-9-turn-off-wi-fi-assist.md b/source/blog/2015-08-20-ios-9-turn-off-wi-fi-assist.md
index 0ae72764..88cfed3e 100644
--- a/source/blog/2015-08-20-ios-9-turn-off-wi-fi-assist.md
+++ b/source/blog/2015-08-20-ios-9-turn-off-wi-fi-assist.md
@@ -2,7 +2,8 @@
title: "iOS 9: turn off Wi-Fi Assist!"
date: 2015-08-20T01:01:57-07:00
date_display: August 20, 2015
----
+...
+
Seriously. Go to Settings->Cellular, and scroll all the way down to reveal the "Wi-Fi Assist" switch. See screenshot at the end of the post. You'll see a description:
> Automatically use cellular data when Wi-Fi connectivity is poor.
diff --git a/source/blog/2015-08-25-automated-os-x-provisioning.md b/source/blog/2015-08-25-automated-os-x-provisioning.md
index 54ee89e6..3a269d0b 100644
--- a/source/blog/2015-08-25-automated-os-x-provisioning.md
+++ b/source/blog/2015-08-25-automated-os-x-provisioning.md
@@ -2,7 +2,8 @@
title: "Automated OS X provisioning"
date: 2015-08-25T08:16:44-07:00
date_display: August 25, 2015
----
+...
+
After quite a bit of work, I finally have a decent OS X provisioning system, capable of provisioning a blank OS X install (with Xcode and CLT) for development and everyday life.
Here it is: [`zmwangx/dotfiles/provision`](https://github.com/zmwangx/dotfiles/blob/master/provision). In case the path changes in the future and invalidates the aforementioned URL, [here](https://github.com/zmwangx/dotfiles/blob/d8e20b731583d69b380d422c8788f61cd4a4e211/provision) is the archived provisioning script at the current master. Of course the provisioning system is not a single script; it reads and executes modules from a [`provision.d`](https://github.com/zmwangx/dotfiles/tree/master/provision.d) directory, which in turn links into other specialized parts of the system.
diff --git a/source/blog/2015-08-31-after-all-these-years-10pt-non-anti-aliased-monaco-is-still-the-best.md b/source/blog/2015-08-31-after-all-these-years-10pt-non-anti-aliased-monaco-is-still-the-best.md
index 601421ec..b552bd9f 100644
--- a/source/blog/2015-08-31-after-all-these-years-10pt-non-anti-aliased-monaco-is-still-the-best.md
+++ b/source/blog/2015-08-31-after-all-these-years-10pt-non-anti-aliased-monaco-is-still-the-best.md
@@ -2,7 +2,8 @@
title: "After all these years, 10pt non-anti-aliased Monaco is still the best"
date: 2015-08-31T06:31:03+08:00
date_display: August 31, 2015
----
+...
+
Ars Technica [just ran a piece](http://arstechnica.com/information-technology/2015/08/open-source-typeface-hack-brings-design-to-source-code/) on the open source programming font [Hack](https://github.com/chrissimpkins/Hack). Now I don't really know why this is news-worthy (open source programming fonts aren't a new thing), but I thought I'd give it a try.
The result is unsurprising. I've loved my 10pt non-anti-aliased Monaco for years, beginning with the Pro profile of Terminal.app. In fact, I initially refused to use iTerm2 precisely because I can't reproduce my beloved typeface in it, until I found out the non anti-aliasing trick. This time again, Hack simply can't compete with my favorite font; see the screenshots below. Among other things, it is way too thick for my liking — the same problem that haunts a whole range of programming fonts. Note that Hack is [supposed to](https://github.com/chrissimpkins/Hack#about) look good at 8px–12px according to its README, but I tested it at 9pt–12pt in iTerm2 (I know, pt is supposed to be larger than px, but I seriously doubt that anyone would want 8px or 6pt as their daily font size — and for that matter iTerm2 doesn't even allow me to go below 9pt, a pretty reasonable restriction, I'd say).
diff --git a/source/blog/2015-09-21-zsh-51-and-bracketed-paste.md b/source/blog/2015-09-21-zsh-51-and-bracketed-paste.md
index 79d78cfe..8d5cfc6b 100644
--- a/source/blog/2015-09-21-zsh-51-and-bracketed-paste.md
+++ b/source/blog/2015-09-21-zsh-51-and-bracketed-paste.md
@@ -2,7 +2,8 @@
title: "Zsh 5.1 and bracketed paste"
date: 2015-09-21T14:40:36-07:00
date_display: September 21, 2015
----
+...
+
**TL;DR.** Jump to [code](#code).
---
diff --git a/source/blog/2015-09-24-apple-watch-digital-crown-tightness-issue.md b/source/blog/2015-09-24-apple-watch-digital-crown-tightness-issue.md
index 54977f02..45233e5b 100644
--- a/source/blog/2015-09-24-apple-watch-digital-crown-tightness-issue.md
+++ b/source/blog/2015-09-24-apple-watch-digital-crown-tightness-issue.md
@@ -2,7 +2,8 @@
title: "Apple Watch: Digital Crown tightness issue"
date: 2015-09-24T10:55:38-07:00
date_display: September 24, 2015
----
+...
+
Quick tip: if the Digital Crown on your Apple Watch *all of a sudden*[^sudden] feels too tight and doesn't turn smoothly, probably it was somehow over-turned (and probably because you played with watchOS 2 Time Travel, as I did). I don't know how that happened because it's clearly not supposed to happen, but turning it in the easy-to-turn direction for a few rounds fixed the tightness issue for me.
There's also an [Apple Support document](https://support.apple.com/en-us/HT204639) on troubleshooting and cleaning the Digital Crown, if the above doesn't help.
diff --git a/source/blog/2015-09-25-removing-google-analytics-from-this-blog.md b/source/blog/2015-09-25-removing-google-analytics-from-this-blog.md
index ebcb5ef2..660a8f64 100644
--- a/source/blog/2015-09-25-removing-google-analytics-from-this-blog.md
+++ b/source/blog/2015-09-25-removing-google-analytics-from-this-blog.md
@@ -2,7 +2,8 @@
title: "Removing Google Analytics from this blog"
date: 2015-09-25T12:30:25-07:00
date_display: September 25, 2015
----
+...
+
There was a lengthy discussion about Peace and ad-blocking in [Accidental Tech Podcast Episode 136](http://atp.fm/episodes/136). There were many lessons to learn from the story; as a side effect, it also made me reconsider Google Analytics on this blog.
I've been a user of ad-blocking for years and have little to no moral burden.[^1][^2] I do hate being tracked online, even by Google (to whom I entrust so much of my personal information), although it's certainly better (I believe) than the host of shadier ad networks out there. Given this, why should I force something even I hate down my visitors' throats? Google Analytics is nice at telling me how many page views I got and where they came from, and I don't earn any money from it so I shouldn't feel guilty, but (1) it does install a tracker, and (2) I care very little about traffic anyway.
diff --git a/source/blog/2015-10-01-auto-hidden-menu-bar-dock-maximized-window-is-the-new-full-screen-mode.md b/source/blog/2015-10-01-auto-hidden-menu-bar-dock-maximized-window-is-the-new-full-screen-mode.md
index 4bd6c985..ffe86c5e 100644
--- a/source/blog/2015-10-01-auto-hidden-menu-bar-dock-maximized-window-is-the-new-full-screen-mode.md
+++ b/source/blog/2015-10-01-auto-hidden-menu-bar-dock-maximized-window-is-the-new-full-screen-mode.md
@@ -2,7 +2,8 @@
title: "Auto hidden menu bar & dock + maximized window is the new full screen mode"
date: 2015-10-01T15:48:59-07:00
date_display: October 1, 2015
----
+...
+
One nice feature of OS X El Capitan is that the menu bar can be auto hidden. Combined an auto hidden dock, we can now emulate the full screen experience with a maximized window while still enjoying overlayed windows, e.g., transparent terminal windows or "Picture in Picture" style small floating player. To see how closely a full screen experience is emulated this way, see the side-by-side screenshots below.
![Maximized and full screen windows of Google Chrome side by side. Can you tell any difference apart from the color of the title bar and a bit of black bottom margin on the left?](/img/20151001-maximized-window-vs-full-screen.png)
diff --git a/source/blog/2015-10-01-upgrading-to-el-capitan.md b/source/blog/2015-10-01-upgrading-to-el-capitan.md
index ebdc1d13..12504536 100644
--- a/source/blog/2015-10-01-upgrading-to-el-capitan.md
+++ b/source/blog/2015-10-01-upgrading-to-el-capitan.md
@@ -2,7 +2,8 @@
title: "Upgrading to El Capitan"
date: 2015-10-01T11:46:44-07:00
date_display: October 1, 2015
----
+...
+
I upgraded to El Capitan last night, and the experience is pretty painless. To be accurate, I'm not really upgrading in place — I always perform a clean install for each major OS upgrade to avoid subtle breakage later on. Therefore, what I did instead was to `rsync` out all my valuable data and state information[^state] to an external drive, wipe the internal drive clean, install new OS from scratch, then `rsync` everything back in. `rsync` is really good at this stuff (I affectionately alias `rsync -avP` to `r` during transfers in and out), and it is simply amazing at dropping the right stuff at the right place, including data deep down `~/Library/Containers`, without interfering with the existing structures[^existing]. With data and state info ready, reinstalling programs is also easy, thanks to my recently finished [automated provisioning system](/blog/2015-08-25-automated-os-x-provisioning.html). It was the first time I used it outside a VM to provision an OS from almost scratch, and I'm really happy with it.
Thus far, most of my programs and applications seem to work just fine on El Capitan. I needed to `brew reinstall pyenv --HEAD` because an OpenSSL fix for El Capitan hasn't made into a release yet. Some of XtraFinder's features[^rootless], including my most needed auto resizing columns, don't seem to work on El Capitan yet, and I'll have to contact the developer soon. The only distratrous incompatibility I've seen lies with Mathematica 9; `codesign -vvvv Mathematica.app` on the v9.0.1 app bundle says `resource envelope is obsolete (version 1 signature)`, and OS X downright refused to open the app, offering me no option other than trashing the app, even when I temporarily set Gatekeeper to "Any". Anyway, I quickly paid to upgrade to v10.2.0 (cost of free OS upgrade, geez), and it ran happily afterwards. Those were basically all I had to deal with. I haven't set up my mail accounts[^mail] and printer yet, but hopefully they will work, and just hopefully Apple Mail finally got it right this time™ and won't ask me to reauthenticate with Gmail all the time.
diff --git a/source/blog/2015-10-03-we-need-an-os-x-security-white-paper.md b/source/blog/2015-10-03-we-need-an-os-x-security-white-paper.md
index b99f54a6..da0e87c9 100644
--- a/source/blog/2015-10-03-we-need-an-os-x-security-white-paper.md
+++ b/source/blog/2015-10-03-we-need-an-os-x-security-white-paper.md
@@ -2,7 +2,8 @@
title: "We need an OS X security white paper"
date: 2015-10-03T03:34:24-07:00
date_display: October 3, 2015
----
+...
+
Apple has been offering an excellent [iOS Security White Paper](https://www.apple.com/privacy/docs/iOS_Security_Guide.pdf) since at least 2012, and it's very informative. I highly encourage everyone to read it. It even explains some annoyances of iOS; for instance, [this week's Upgrade episode](http://www.relay.fm/upgrade/56) discussed, [in Gruber's words](https://daringfireball.net/linked/2015/10/01/upgrade-56), "the lousy, painstaking, and at times downright confusing experience of migrating to a new iOS device", and once you read the white paper you'll realize that many things just can't be migrated due to iOS's hardware security model — basically, certain classes of data are encrypted with crypto keys baked into the silicon (see the section "Hardware security features"). I'm not saying the migration experience should be this painful (I would love to see it fixed or improved), but at least there's an explanation.[^migration]
But I digress. This post is about OS X. I've been hunting for an OS X equivalent for a while now, but I don't think it exists. And recently people are talking about Apple's [updated Privacy website](https://www.apple.com/privacy/)[^site], so I went there with a glimmer of hope. End result: no luck. In fact, Apple links to its iOS Security White Paper at the bottom of "[Our Approach to Privacy](https://www.apple.com/privacy/approach-to-privacy)":
diff --git a/source/blog/2015-10-10-printing-long-80-character-per-line-plain-text-document-in-two-columns.md b/source/blog/2015-10-10-printing-long-80-character-per-line-plain-text-document-in-two-columns.md
index e17c5807..6d06a9f3 100644
--- a/source/blog/2015-10-10-printing-long-80-character-per-line-plain-text-document-in-two-columns.md
+++ b/source/blog/2015-10-10-printing-long-80-character-per-line-plain-text-document-in-two-columns.md
@@ -2,7 +2,8 @@
title: "Printing long, 80-character-per-line plain text document in two columns"
date: 2015-10-10T22:35:15-07:00
date_display: October 10, 2015
----
+...
+
**TL; DR**. Jump to [code](#code).
---
diff --git a/source/blog/2015-10-12-the-importance-of-dated-detailed-release-notes.md b/source/blog/2015-10-12-the-importance-of-dated-detailed-release-notes.md
index 4ca7ddbd..2d0b977b 100644
--- a/source/blog/2015-10-12-the-importance-of-dated-detailed-release-notes.md
+++ b/source/blog/2015-10-12-the-importance-of-dated-detailed-release-notes.md
@@ -2,7 +2,8 @@
title: "The importance of dated, detailed release notes"
date: 2015-10-12T14:29:42-07:00
date_display: October 12, 2015
----
+...
+
I can't stress how much I value release notes, especially for closed source, commercial software. None of us want to invest on a piece of abandonware (unless it is ageless, which is quite unlikely for anything with a GUI), or a piece of software that is not completely abandoned, but takes a full year to adapt to the latest OS, campatibility-wise or UI-wise; and release notes, especially with dates, serve as almost the single metric for gauging developer commitment. In fact, whenever I try to learn about a piece of software that I heard about, one of the first things I do, usually after browsing through features and screenshots and before I even download the software to try out, is to look for its release notes and skim through it if available, and the outcome largely determines whether I'll even bother to download the installer.[^cask] A prominent, dedicated page with dated, detailed release notes immediately leaves a good impression on me.
Unfortunately, many developers or publishers don't value release notes as much as I do. Several problems, in ascending order of seriousness:
diff --git a/source/blog/2015-10-14-follow-up-the-sad-state-of-finder-on-el-capitan.md b/source/blog/2015-10-14-follow-up-the-sad-state-of-finder-on-el-capitan.md
index bc87cd30..9d0a9c85 100644
--- a/source/blog/2015-10-14-follow-up-the-sad-state-of-finder-on-el-capitan.md
+++ b/source/blog/2015-10-14-follow-up-the-sad-state-of-finder-on-el-capitan.md
@@ -2,7 +2,8 @@
title: "Follow-up: The sad state of Finder on El Capitan"
date: 2015-10-14T12:30:32-07:00
date_display: October 14, 2015
----
+...
+
**10/14/2015 update** (updated even before I published the article). Just as I was finishing this post, an update to TotalFinder came. [1.7.8](http://totalfinder.binaryage.com/beta-changes). And holy cow, it fixed automatic column resizing! The fix isn't perfect — there's actually a visible delay before resizing, but I'm happy again. Long live TotalFinder!
---
diff --git a/source/blog/2015-10-14-sip-for-the-greater-good.md b/source/blog/2015-10-14-sip-for-the-greater-good.md
index 3dbf7b24..9ae6cbac 100644
--- a/source/blog/2015-10-14-sip-for-the-greater-good.md
+++ b/source/blog/2015-10-14-sip-for-the-greater-good.md
@@ -2,7 +2,8 @@
title: "SIP — For the Greater Good"
date: 2015-10-14T17:07:24-07:00
date_display: October 14, 2015
----
+...
+
In recent months I wrote a few thousand words lamenting Finder and [SIP](https://en.wikipedia.org/wiki/System_Integrity_Protection) on El Capitan. See [The sad state of Finder on El Capitan](/blog/2015-07-30-the-sad-state-of-finder-on-el-capitan.html) and [its follow-up](/blog/2015-10-14-follow-up-the-sad-state-of-finder-on-el-capitan.html).
For the record, I'm not blaming SIP. It does deal a serious blow to people who in-memory patch stock applications (and there's a good discussion about the creativity aspect on [ATP episode 128](http://atp.fm/episodes/128)), but the general public — at least more than 95% of users — should not be negatively affected, at least not in the short term. And I can understand why SIP protection comes at this time. Macs used to be safe, but in recent years we are seeing real world exploits increasingly more often. History has shown that technically-challenged users simply can't be entrusted with admin accounts, they are too willing to give their passwords to shady software downloaded from shady corners of the web (and sometimes even renowned corners get hacked). But they are given admin accounts anyway (there has to be someone knowing the admin password), so Apple has to come up with ways to protect them. SIP is a pretty good response.
diff --git a/source/blog/2015-10-26-att-to-pure-talkusa-one-month-later.md b/source/blog/2015-10-26-att-to-pure-talkusa-one-month-later.md
index 521ad0ba..9eb02592 100644
--- a/source/blog/2015-10-26-att-to-pure-talkusa-one-month-later.md
+++ b/source/blog/2015-10-26-att-to-pure-talkusa-one-month-later.md
@@ -2,7 +2,8 @@
title: "AT&T to Pure TalkUSA, one month later"
date: 2015-10-26T00:00:30-07:00
date_display: October 26, 2015
----
+...
+
**TL;DR**: If you have questions about Pure TalkUSA unanswered by the [official FAQ](https://www.puretalkusa.com/cell-phones-sim-cards.php), I have some information for you starting from the section "[migration experience](#migration-experience)".
---
diff --git a/source/blog/2015-11-06-microsoft-drops-unlimited-onedrive-storage-after-people-use-it-for-unlimited-storage.md b/source/blog/2015-11-06-microsoft-drops-unlimited-onedrive-storage-after-people-use-it-for-unlimited-storage.md
index b89f9420..2bfd26c5 100644
--- a/source/blog/2015-11-06-microsoft-drops-unlimited-onedrive-storage-after-people-use-it-for-unlimited-storage.md
+++ b/source/blog/2015-11-06-microsoft-drops-unlimited-onedrive-storage-after-people-use-it-for-unlimited-storage.md
@@ -2,7 +2,8 @@
title: "Microsoft drops unlimited OneDrive storage after people use it for unlimited storage"
date: 2015-11-06T10:49:51-08:00
date_display: November 6, 2015
----
+...
+
[Story on Ars Technica](http://arstechnica.com/information-technology/2015/11/microsoft-drops-unlimited-onedrive-storage-after-people-use-it-for-unlimited-storage/). [Official announcement](https://blog.onedrive.com/onedrive_changes/). I was playing catch up on this week's RSS when this one punched in my face.
I currently have 5 TB of data in OneDrive. I was once worried about lock-in when I eventually have 20 or 100 TB there, but now that they have shown their true colors, the worries are all gone. They are not even offering anything past 1 TB. We have seen this too many times — shit happens when people actually use unlimited for unlimited. Usually unlimited quickly becomes qualified, but in this case, unlimited simply becomes limited. What irony when one looks back at their announcement from [a year ago](http://localhost:8000/blog/2014-10-27-onedrive-goes-unlimited.html):
diff --git a/source/blog/2015-11-15-we-need-a-programming-keyboard-on-ios.md b/source/blog/2015-11-15-we-need-a-programming-keyboard-on-ios.md
index 45a50a3d..654c3d01 100644
--- a/source/blog/2015-11-15-we-need-a-programming-keyboard-on-ios.md
+++ b/source/blog/2015-11-15-we-need-a-programming-keyboard-on-ios.md
@@ -2,7 +2,8 @@
title: "We need a programming keyboard on iOS"
date: 2015-11-15T02:17:05-08:00
date_display: November 15, 2015
----
+...
+
We do. If you ever tried to say something on GitHub (web) or StackOverflow (web or app) on iOS, you'll probably agree with me. The stock keyboard (or any third party keyboard that I've heard of) is simply awful at this. Typing on iOS software keyboard is unpleasant enough to begin with, but behold:
* Auto"correct" messes up everything as fast as you can type, which isn't really fast anyway; might as well call it autorot.
diff --git a/source/blog/2015-11-25-bash-function-exporting-fiasco.md b/source/blog/2015-11-25-bash-function-exporting-fiasco.md
index 520bcce5..eda0c914 100644
--- a/source/blog/2015-11-25-bash-function-exporting-fiasco.md
+++ b/source/blog/2015-11-25-bash-function-exporting-fiasco.md
@@ -2,7 +2,8 @@
title: "Bash function exporting fiasco"
date: 2015-11-25T15:38:13-08:00
date_display: November 25, 2015
----
+...
+
Bash is the only major shell (and the only shell that I know of) that implements function exporting. By now everyone should have heard of this feature, I suppose, after the publicity of Shellshock last year. I was personally introduced to it while writing parallel processing scripts [with GNU Parallel](https://www.gnu.org/software/parallel/parallel_tutorial.html#Transfer-environment-variables-and-functions) (long before Shellshock), and it seemed useful and clever at that time. Back then I often wondered why it didn't make its way into Z shell. However, now that I'm much more seasoned in shell scripting, I can see why and how this feature is troubled and of debatable value.
Two problems lie at the heart of function exporting:
diff --git a/source/blog/2015-12-08-safeguarding-git-repos-against-accidental-rm.md b/source/blog/2015-12-08-safeguarding-git-repos-against-accidental-rm.md
index d6a1f77b..41f83778 100644
--- a/source/blog/2015-12-08-safeguarding-git-repos-against-accidental-rm.md
+++ b/source/blog/2015-12-08-safeguarding-git-repos-against-accidental-rm.md
@@ -2,7 +2,8 @@
title: "Safeguarding git repos against accidental rm"
date: 2015-12-08T00:17:39-08:00
date_display: December 8, 2015
----
+...
+
Everyone who has spent a sizable portion of their life in terminals has experienced that "oh shit" moment: you realize what you've done immediately after you've hit enter, but it's already too late. And needlessly to say, many of those are associated to accidental `rm`s.
I just had one of those moments. I was going to delete a subdirectory of `~/.config`, but hit return prematurely, and the command line ended up being `rm -r ~/.config`. Imagine the horror one second later. Fortunately I was saved by the read-only objects in `.git`, which triggered prompts; however, damage was already done, to some extent. I had to reinit the repo and do a hard reset, and a corrupted submodule was in my way (it blocked my attempt of `git reset --hard`) which I eventually had to completely remove and re-add. In the end everything was recovered (hopefully) and back to normal, but this episode was definitely not great for heart health, which led me to rethink `rm`.
diff --git a/source/blog/2015-12-16-spoiled-by-retina-in-less-than-a-day.md b/source/blog/2015-12-16-spoiled-by-retina-in-less-than-a-day.md
index 49389a3a..3553e892 100644
--- a/source/blog/2015-12-16-spoiled-by-retina-in-less-than-a-day.md
+++ b/source/blog/2015-12-16-spoiled-by-retina-in-less-than-a-day.md
@@ -2,7 +2,8 @@
title: "Spoiled by Retina, in less than a day"
date: 2015-12-16T21:10:08-08:00
date_display: December 16, 2015
----
+...
+
I finally got a 15'' Retina MacBook Pro this morning to replace my 13'' mid-2012 non-Retina MacBook Pro, whose spinning disk has been getting increasingly slower (or so I felt).[^replace] Apparently this is a pretty significant landmark in my personal computing history, since I'm saying goodbye to both spinning disk and non-Retina display on my primary computing device.
The transition was initially smooth except for a few things. First, as a tap-to-click wizard I immediately turned on tap-to-click, but I had a hard time dragging things because it was too easy to trigger a force touch instead on the medium setting, and under the firm setting I could hardly force touch at all; in the end I just turned off force touch altogether, and haven't had any problem since. By the way, I was initially worried about the keyboard too but it worked surprisingly well for me, so no complaints there. Secondly, [10pt non-anti-aliased Monaco](/blog/2015-08-31-after-all-these-years-10pt-non-anti-aliased-monaco-is-still-the-best.html) looks weird on Retina since it's no longer the beloved bitmap version. I turned on antialiasing and now it's no longer weird, but it felt totally different and I'm not sure if I like it (definitely not as much as the 10pt bitmap Monaco anyway). It's okay right now but I'll probably need to spend some time trying out different fonts. Obviously there are [like-minded folks](https://news.ycombinator.com/item?id=10140728) out there. Sad story.
diff --git a/source/blog/2015-12-20-regex-flavor-hell.md b/source/blog/2015-12-20-regex-flavor-hell.md
index 6895299f..15488655 100644
--- a/source/blog/2015-12-20-regex-flavor-hell.md
+++ b/source/blog/2015-12-20-regex-flavor-hell.md
@@ -2,7 +2,8 @@
title: "Regex flavor hell"
date: 2015-12-20T16:03:03-08:00
date_display: December 20, 2015
----
+...
+
I write a lot of shell scripts, which means dealing with common *ix utilities a lot. I typically want my scripts to work on both OS X and Linux (or OS X + GNU utilities, which is my personal setup), which means writing commands that are understood in both GNU/Linux and BSD worlds. Unfortunately that's not so simple, because to do that I usually have to give up readily available functionalities (especially the vast collection of useful options typical of GNU utilities) and am constantly thrown back to the stone age that is POSIX, or a little bit more than POSIX.
Working with regular expressions is especially painful. Almost every implementation of every utility (with regex support) has its own flavor of regex. Most notably the big three: `grep`, `sed` and `awk`. GNU utilities of course come with GNU extensions, but they are nothing when aiming for compatibility. Ignoring GNU extensions, there's a way to turn on standard POSIX extensions (ERE) on `sed`, but unfortunately GNU and BSD use different flags: `-r` for GNU sed and `-E` for BSD sed. The two implementations of `grep` thankfully use the same flag `-E` to turn on ERE, but GNU grep, being a GNU utility and having to distinguish itself from its mundane counterpart, further implements `-P,--perl-regexp` — regexers' dream. It's there but I can't use it, except in an interactive shell. `awk` has more than two implementations and will be left out of this discussion.
diff --git a/source/blog/2015-12-26-autoenv-with-auto-cleanup.md b/source/blog/2015-12-26-autoenv-with-auto-cleanup.md
index 68f8dd2e..abf50758 100644
--- a/source/blog/2015-12-26-autoenv-with-auto-cleanup.md
+++ b/source/blog/2015-12-26-autoenv-with-auto-cleanup.md
@@ -2,7 +2,8 @@
title: "autoenv with auto cleanup"
date: 2015-12-26T00:15:48-08:00
date_display: December 26, 2015
----
+...
+
I heard about [kennethreitz/autoenv](https://github.com/kennethreitz/autoenv) a long time ago. The idea of autoloading project-specific environment modifications is nice, but no auto cleanup after leaving a project was a showstopper for me.
Today, I took matters into my own hands and wrote a fresh Zsh implementation[^re] with auto cleanup support. Check it out: <https://github.com/zmwangx/prezto/tree/master/modules/autoenv>.
diff --git a/source/blog/2015-12-27-lesson-on-magic-method-access-of-python-new-style-classes-from-my-failed-python3-port-of-tomorrow.md b/source/blog/2015-12-27-lesson-on-magic-method-access-of-python-new-style-classes-from-my-failed-python3-port-of-tomorrow.md
index a64ce3d3..0ab23855 100644
--- a/source/blog/2015-12-27-lesson-on-magic-method-access-of-python-new-style-classes-from-my-failed-python3-port-of-tomorrow.md
+++ b/source/blog/2015-12-27-lesson-on-magic-method-access-of-python-new-style-classes-from-my-failed-python3-port-of-tomorrow.md
@@ -2,7 +2,8 @@
title: "Lesson on magic method access of Python new-style classes (from my failed Python3 port of Tomorrow)"
date: 2015-12-27T16:47:05-08:00
date_display: December 27, 2015
----
+...
+
I know the title is formidably long, but I can't find something more accurate (and my homegrown mini CMS doesn't support subtitle), so please bear with me.
So, I have [madisonmay/Tomorrow](https://github.com/madisonmay/Tomorrow) — "magic decorator syntax for asynchronous code in Python 2.7" — bookmarked for a long time[^long] without ever trying it, because I simply don't write Python 2 code any more (except when I try to maintain compatibililty). I felt kind of strange that a ~50-line project with ~1000 stars on GitHub hasn't been ported to Python 3 already, so I gave it a shot just now.
diff --git a/source/blog/2015-12-28-why-i-want-lossless-music-on-itunes-music-store.md b/source/blog/2015-12-28-why-i-want-lossless-music-on-itunes-music-store.md
index d666321b..5854008d 100644
--- a/source/blog/2015-12-28-why-i-want-lossless-music-on-itunes-music-store.md
+++ b/source/blog/2015-12-28-why-i-want-lossless-music-on-itunes-music-store.md
@@ -2,7 +2,8 @@
title: "Why I want lossless music on iTunes Music Store"
date: 2015-12-28T03:15:45-08:00
date_display: December 28, 2015
----
+...
+
This is an impulse post after reading ["Apple again rumored to be working on high-resolution audio"](https://marco.org/2015/12/27/apple-hd-audio-again).[^macrumors]
To be clear, I'm no audiophile. I can't tell the difference between 256kbps AAC and lossless (maybe not even the difference between 128k and 256k), and my midrange to lower midrange equipments probably won't let me tell anyway. I'm certainly not a consumer of snake oil.
diff --git a/source/blog/2015-12-29-catches-when-installing-windows-7-with-boot-camp.md b/source/blog/2015-12-29-catches-when-installing-windows-7-with-boot-camp.md
index aba00ef6..b74cbb45 100644
--- a/source/blog/2015-12-29-catches-when-installing-windows-7-with-boot-camp.md
+++ b/source/blog/2015-12-29-catches-when-installing-windows-7-with-boot-camp.md
@@ -2,7 +2,8 @@
title: "Catches when installing Windows 7 with Boot Camp"
date: 2015-12-29T15:09:16-08:00
date_display: December 29, 2015
----
+...
+
I was looking for a use for my retired Mid-2012 Non-Retina MacBook Pro 13''^[2.9 GHz i7 + Intel HD Graphics 4000 + 16 GB RAM + frigging slow 750 GB 5400-rpm spinning disk I've yet to replace.], and unsurprisingly I figured that I would turn it into a OS X-Windows dual boot for some occasional gaming. I'm a CnC fan (not hardcore, but still), mainly for RA2/YR and TW/KW, and playing these inside Fusion is really a subsubpar experience. Due to the age of these games and their compatibility problems on Windows 8 and higher^[RA2/YR used to have problems even on Windows 7, at least inside Fusion, so I used to play them in XP SP3 VMs; I've yet to try them with Windows 7 running on bare metal.], I chose to shoot for a Windows 7 install.
Apple has a pretty thorough walkthrough in the support article [Install Windows 7 and earlier on your Mac using Boot Camp](https://support.apple.com/en-us/HT205016). There are, however, some catches that I would like to collect and share in this post.
diff --git a/source/blog/2016-01-01-virtualenvs-for-everyone.md b/source/blog/2016-01-01-virtualenvs-for-everyone.md
index faf27fb7..f333e303 100644
--- a/source/blog/2016-01-01-virtualenvs-for-everyone.md
+++ b/source/blog/2016-01-01-virtualenvs-for-everyone.md
@@ -2,7 +2,8 @@
title: "Virtualenvs for everyone"
date: 2016-01-01T22:21:14-08:00
date_display: January 1, 2016
----
+...
+
Python distutils for the most part is rather pleasant to work with. That is, pleasant until you've accumulated so many packages that you eventually run into a clash of namespace, or a dependency conflict (or dependency hell as most would affectionately call it).[^trouble] In contrast, npm's approach to dependencies shuts out dependency hell completely, but it is so paranoid and costs so much duplication that I find it hard to appreciate unless necessary. Somewhere in between there's the virtualenv approach which I find most appealing for smallish projects — keep a single copy of each package in the dependency tree in a contained environment specific to the project at hand. This is how we debug Python projects, and it certainly also should be *the* way we run command line tools written in Python.
There's another reason I like virtualenvs. There are tons of problems associated with choosing between Python 2 and 3 — some projects are Python 2 only, some are instead Python 3, some claim to be compatible with both but actually present subtle problems when you use one instead of the other. However, without virtualenvs, there's only one `bin` — `/usr/local/bin` — and everything's competing for it. Most programs (especially ones with a typical `setup.py`) don't install a soft/hardlink with a helpful `2` or `3` suffix when installing executables, let alone detailed suffixes like `2.7` or `3.5`, so without probing into the shebangs you're never sure which version of Python you're running your program with, and as a result Python 2/3 (or even a point release)-specific bugs occur randomly. Virtualenvs solve the problem by allowing you to have as many bins (and includes, and libs) as you like.