Last updated on November 22, 2018
Desktop email clients, such as Thunderbird and Claws Mail, are preferred over their web counterparts by many professionals and power users due to their additional convenience and security. However, one big downside is that they often expose the sender’s IP address to the receivers, since many SMTP servers record the sender’s IP address and put it in the header, something similar to
Received: from [xxx.xxx.xxx.xxx] (my.example.com. [xxx.xxx.xxx.xxx]). This, unfortunately, puts the sender’s privacy in great jeopardy, as an IP address can reveal so much information including location, ISP, and institution names.
To address this issue, one simple solution is to let the email client connect via a proxy. While a system-widely available proxy works for many users, some of us just want our email clients, but not other programs, to go through a specific proxy. In this post, I’ll demonstrate how to use an email client automatically via SSH tunneling. The instructions are specifically tailored for GNU/Linux and MacOS users, as it involves some uses of UNIX commands and bash scripts; if you are on Windows, you can still follow the instructions with the help of Cygwin.
On GNU/Linux, it is easy to create SOCKS proxies using programs such as ssh or tor. However, many applications on GNU/Linux, such as LibreOffice and genymotion (up to the date on which this post is written), can be configured to directly use HTTP proxies (or web proxies), but not SOCKS proxies. In this post, we will use privoxy, a non-cache web proxy, to enable these applications to use SOCKS proxies.
Pip is a package management system for installing and managing Python software packages. To enable auto completion for
pip in zsh, the documentation of pip suggests adding the following line to
eval "`pip completion --zsh`"
However, merely having this line would not enable auto completion for
pip3. To enable auto completion for
pip3 as well, add the following line after the line above:
compctl -K _pip_completion pip3
Last updated on October 11, 2018
~/.inputrc is the user configuration file of GNU readline, which provides customizable command line user interfaces for many important interactive programs, such as Bash and Python interactive shell. However, many of its useful features are disabled by default. In this post, we will walk through a decent
~/.inputrc file to release the power of readline.
Last updated on October 28, 2018
Libinput is a library to handle input devices in Wayland and X.Org. It can be used as a drop-in replacement for evdev and synaptics in X.Org, and it is supported by a wide range of desktop environments, including GNOME and Xfce. In this post, we will see how to enable natural scrolling for trackpads using libinput. We will also leave mouses alone, i.e., no natural scrolling for mouses.
First, we need to know the name of the trackpad to enable natural scrolling for. This can be easily known by executing
xinput --list. My output includes the following:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ bcm5974 id=13 [slave pointer (2)]
It is easy to see that my trackpad is
Last updated on December 13, 2016
The make utility is an standard utility on POSIX systems (GNU/Linux, macOS, etc.) that update files derived from other files, such as compiling source files to their binary forms. It is widely supported and used across different fields such as organizing and building C/C++/Fortran projects, building Sphinx documentation, etc.
The most popular implementation of the make utility is probably GNU make, which is usually the default make program on various GNU/Linux distributions. (On macOS, the version of the default GNU make is pretty old. Please consult Install and Use GNU Command Line Tools on macOS/OS X for a newer version.) It adds one very important feature besides the standard make specification: parallelization. The command line option
-j can be used to specify the maximum number of jobs that it is allowed to run simultaneously. However, it is quite annoying to type up this option every time when using it—we want a setting such that the CPU can be fully utilized by default. To achieve this goal, add the following lines to your
~/.bashrc if you use bash or
~/.zshrc if you use zsh:
# set MAKEFLAGS
if type nproc &>/dev/null; then # GNU/Linux
export MAKEFLAGS="$MAKEFLAGS -j$(($(nproc)-1))"
elif type sysctl -n hw.ncpu &>/dev/null; then # macOS, FreeBSD
export MAKEFLAGS="$MAKEFLAGS -j$(($(sysctl -n hw.ncpu)-1))"
The code above sets the envrionmental variable
MAKEFLAGS, which specifies the command line arguments of any invoked make subprocesses. It is set such that the maximum number of jobs that is allowed to be run simultaneously is equal to the number of available CPU cores minus 1. In this way, the hardware is more or less fully utilized when using make, with one CPU core left for other potential tasks on the system.
Last updated on December 13, 2016
When sending out an email, sometimes we just forgot to attach the attachments. An attachment reminder can largely prevent this: You are asked to confirm whether you have forgotten the attachments if your message body shows that you may need one. However, Emacs by default does not provide such a feature in its mail composing mode
message-mode, which is used in email clients such as gnus and mu4e. Here is an attachment reminder based on this comment:
(defun my-message-current-line-cited-p ()
"Indicate whether the line at point is a cited line."
(string-match (concat "^" message-cite-prefix-regexp)
(buffer-substring (line-beginning-position) (line-end-position)))))
(defun my-message-says-attachment-p ()
"Return t if the message suggests there can be an attachment."
(and (setq search-result (re-search-forward "\\(attach\\|pdf\\|file\\)" nil t))
(defun my-message-has-attachment-p ()
"Return t if the message has an attachment."
(re-search-forward "<#part" nil t))))
(defun my-message-pre-send-check-attachment ()
(when (and (my-message-says-attachment-p)
(y-or-n-p "The message suggests that you may want to attach something, but no attachment is found. Send anyway?")
(error "It seems that an attachment is needed, but none was found. Aborting sending."))))
(add-hook 'message-send-hook 'my-message-pre-send-check-attachment)
If “attach”, “pdf” or “file” are in the message you are sending, a confirmation would be required to confirm the attachments if they are not attached.
Matrix is an open standard for decentralized persistent communication, shares somewhat similar goals to Jabber/XMPP. It attracts people from using centralized communicating software such as Facebook Messenger, WhatsApp, etc. In the Matrix protocol, a piece of software called “homeserver” plays a key role to connect users. To use Matrix, one such server must be set up. In this post, we will set up Synapse, an implementation of the Matrix homeserver maintained by the Matrix team, using a minimal configuration on Ubuntu 16.04.
Last updated on September 18, 2017
ls command is a command to list files on a UNIX-like system. It is probably one of the most used command. However, a plain
ls command without any polishing may look really “plain”. Here, we will slightly configure this command to make it more usable:
- More colorful output
- Automatic pagination for long file lists
- File type indication
- Human readable sizes
- Natural ordering of files
ls before configuration
ls after configuration
browse-url in Emacs can be used to start a browser process to visit a given URL. It is used by many packages such as
mu4e, etc. However, on GNU/Linux, by default a new browser process started by
browse-url will be killed if the Emacs process exits. To prevent the browser process from being killed, add the following code to your Emacs init file:
(when (and (executable-find "setsid") (executable-find "gnome-open"))
(lambda (url &optional ignored)
(start-process "" nil "setsid" "gnome-open" url))))
You will need both the
gnome-open commands available. Note that replacing
xdg-open is not guaranteed to work.