Counting Word Frequencies in One Line

9 August 2016
cat book.txt | \
tr '!()[]{};:",<.>?“”‘’*/\r' ' ' | \
tr ' ' '\n' | \
grep -a -P "^[\p{L}\p{N}\-']+\$" | \
grep -a -P -v "^[\p{N}\-']+\$" | \
sed "s/'s\$//" | \
sed "s/^'//" | sed "s/'\$//" > words.txt

cat words.txt | \
sort | uniq -c | \
sort -nr | \
cut -c9- > words_desc.txt
  • replace punctuations with space; remove \r from `\r\n’
  • one word per line
  • keep only words composed of unicode letters, numbers, hyphen and apostrophe
  • remove pure numbers
  • remove ’s
  • remove starting and ending apostrophe
  • output words.txt

  • sort and count unique words

  • sort by freqency in descending order

  • trim the frequency column

A Note on Mobi Format

3 August 2016

A Manager's FAQ

3 July 2016

This is an insightful list from Henry Ward:

  • How do I get employees to perform better? Tell them what they are doing well.
  • How do I give negative feedback? By being curious.
  • How do I decide what to delegate? Delegate the work you want to do.
  • How should I prioritize? Fix problems. Then prevent problems.
  • How should I grade employees? Don’t. Teach them to self-evaluate.
  • When do I fire somebody? When you know they can’t succeed.
  • How do I fire somebody? By apologizing for our failures.
  • Why can’t I just tell people what to do? Because the more responsibility you have, the less authority you have.
  • How do I know if I am a good manager? Employees ask you for advice.
  • How do I know if I have good management team? Shit rolls uphill.

On Reliable Persistence

2 July 2016

A short investigation on reliable persistence:

  • Crash consistency is hard but possible at a huge performance cost

  • Data safty must rely on distributed solution

  • Perhaps we should just give up manual fsync and rely on

    • OS background flush
    • corruption detection & correction at startup
    • replication

Note on OpenWRT

27 February 2016

Obtain OpenWRT

  • Find the device model at the Table of Hardware (Huawei HG556a C)
  • Open Device Techdata for Firmware OpenWrt Install URL
  • Open Device Page for Installation instructions

Computer - Cable - Router

Connect the computer to the router with a cable.

Install OpenWRT

Follow the instructions to install OpenWRT.


First login:


Change password to enable SSH:


For public key authentication, add the public key:

ssh-copy-id root@
ssh root@
mv ~/.ssh/authorized_keys /etc/dropbear


In /etc/config/wireless:

config wifi-device  radio0
	# option disabled 1

config wifi-iface
	option device     radio0
	option network    lan
	option mode       ap
	option encryption psk2
	option hidden     1
	option ssid       [SSID]
	option key        [WiFi password]
	option macaddr    [00:0A:4B:3C:6D:02]



Computer - WiFi - Router

Disconnect the cable to the router. Try SSH via WiFi.


In /etc/config/network:

It is better to change the lan address so that it will not be conflicted with the upstream address.

config interface 'lan'
	option ipaddr ''
# lan switch
config switch_vlan
	option device 	eth0
	option vlan 	1
	option ports 	"1 2 5t"

# wan switch
config switch_vlan
	option device 	eth0
	option vlan 	2
	option ports 	"0 5t"

For DHCP wan:

config interface wan
	option ifname eth0.2
	option proto  dhcp

For PPPOE wan:

config interface wan
	option ifname   eth0.2
	option proto    pppoe
	option username [PPPOE user name]
	option password [password]

Computer - WiFi - Router - Cable - Internet

Connect the internet cable to the router, reboot the router.

About Pretty Printing

1 February 2016


cat xxx.json | jq .


cat xxx.xml | xmllint --format -

Sending Email from Gmail using Go

31 January 2016
  1. Turn on “2-Step Verification” so that an “App password” can be generated

  2. go get gopkg.in/gomail.v2

  3. Send your Email like the example below:

package main

import (

func main() {
	m := gomail.NewMessage()
	m.SetHeader("From", "from_address@gmail.com")
	m.SetAddressHeader("To", "to_adress@xxx", "to_name")
	m.SetAddressHeader("Cc", "cc_adress@xxx", "cc_name")
	m.SetHeader("Subject", "Hello! TEST!")
	m.SetBody("text/html", "Hello! <b>TEST</b>!")

	d := gomail.NewPlainDialer("smtp.gmail.com", 587, "from_address@gmail.com", "the App password")

	if err := d.DialAndSend(m); err != nil {