“Talk is cheap,
show me the code.”

"We reject kings, presidents and voting. We believe in rough consensus and running code."
This is how the Internet was built. This is basically how the modern technology is developed. And I believe the future will be built based upon this as well.
It works.



pipe_file=$(mktemp --dry-run)
mkfifo ${pipe_file}
exec {pipe_fd}<>${pipe_file}
rm ${pipe_file}
printf "%-${max_jobs}s" >&${pipe_fd}
for job in ...
  read -n 1 -u ${pipe_fd}
    echo "start ${job}"
    # do stuff for ${job} ...
    echo "finish ${file}"
    printf '%-1s' >&${pipe_fd}

This piece of script uses a FIFO to manage the parallel jobs. Initially, the FIFO is filled with n characters, each representing an available slot for a job. Before a job starts, it reads a character from the FIFO. Once a job finishes, a character is written back to the FIFO. Thus the FIFO is empty if and only if there are n jobs running. New jobs will not be spawned because the FIFO read will block until at least 1 running job finishes.

{varname} style automatic file descriptor allocation requires bash 4.1+.



There are problems in the rt2800usb driver on Linux and according to this post I have to set nohwcrypt=1 for the rt2800usb kernel module.

sudo ifconfig wlan0 down
sudo rmmod -f rt2800usb
sudo modprobe rt2800usb nohwcrypt=1
sudo ifconfig wlan0 up

To make it permenant I have to put the following in /etc/modprobe.d/rt2800usb.conf

options rt2800usb nohwcrypt=1

Damn it… I really should have found this earlier…


然而,任何智力正常的人,不都应该把甜酒喝了吧苦酒倒了吗 (╯ ̄Д  ̄)づ╧═╧


有的人出生的时候是带了一箱甜酒啊 (╯ ̄Д  ̄)づ╧═╧
有的人出生的时候是带了一箱苦酒,而且喝前面一大半的时候还不给带甜酒 (╯ ̄Д  ̄)づ╧═╧
有的人好死不死就是会被天上掉下来的甜酒砸啊 (╯ ̄Д  ̄)づ╧═╧
不说了,我去喝苦酒去了 *~( ̄▽ ̄)~[]

Pass a Device to a Linux Container

Recently I was trying to make FPGA tools running inside a LinuX Container (LXC). Getting the software tools running is basically about coping with Xilinx’s horrible bash scripts. Making the container see the FPGA hardware seems more challenging and there are very few references on the Internet. The major trick is to pass the correct devices to the LXC. FPGAs (at least those…


If you are working with some software which requires you to source some code and messes up with your PATH and other environment variables like Vivado and Merlin compiler, here is a simple and straightforward method to get rid of the mess (to some extent).

. /space/Xilinx/SDAccel/${VERSION}/settings64.sh
# do something if necessary
if ! test "$0" -ef "$(which $(basename $0))"
    exec $(basename $0) "$@"
    if test -t 2
        echo "Recursive call detected!" 1&>2

Some notes:

  • Start with #!/bin/bash if you or your script use bash-specific syntax!
  • Give this file execution permission with chmod +x!
  • Make sure this file itself has the same name as the target program, or is soft-linked to it!
  • Use . instead of source, which improves compatibility!

On Linux, if you see

mtr: unable to get raw sockets.

The following might help:

sudo chmod 4755 $(which mtr)


The reason this happens is that only privileged processes (or processes with proper capabilities(7) on Linux) can create raw sockets, which is needed to send/receive ICMP packets. By chmod(2), the executable will get the S_ISUID mode, which means it can set process effective user ID when execve(2).

A safer solution is

sudo setcap cap_net_raw+ep $(which mtr)

which only gives mtr the cap_net_raw capability.

Reinstalling the mtr package via the package manager should also solve the problem since it will do whatever appropriate to make it work.



For English only readers, if any: this article is about my mother’s father, who recently passed away. I could have been there before he left, but I didn’t. I shall regret this for all the rest of my life. However, he has relieved from pain and we all should carry on with our lives. We should try to make our life better…


According to cplusplus.com, std::vector<bool> in C++ is specialized and consumes only 1/8 space as you may have expected. However, as 8-bit bytes are usually the shortest available type in most implementations, thread-safety is not guaranteed. This could have caused significant trouble in my current project. How lucky I am to notice this interesting feature before I have actually encountered trouble.

Besides, std::bitset provides a fixed size bit array whose length is fixed at compile-time.

μtorrent Optimization Guide

Let’s assume you have sufficiently high bandwidth. For example, you are in college and your university does not care about torrenting. One frustrating thing when you are torrenting is that your hard disk does not provide zero latency or infinite bandwidth. μtorrent might be complaining “100% Disk IO” all the time and refuses to download or upload for quite a long time. After a…

Enable HTTP/2 in Nginx

For Nginx 1.9.5 and later, change listen 443 ssl; to listen 443 ssl http2; and you are all set. Note that all implementations of HTTP/2 require HTTPS. Ubuntu 16.04 LTS already comes with Nginx 1.10. To automatically renew certificates from letsencrypt, just run sudo /path/to/letsencrypt-auto renew 1>/dev/null 2>&1 && sudo nginx -s reload periodically if you have initiated the configurations correctly. 🙂…


差不多是高三时候看到的文章,刚整理冷数据的时候看到,还是觉得写的蛮好。现在找不到当时的引用来源了,姑且仍保留当时的引用格式吧。 打不死的小怪兽 via豆瓣 2010-04-03 20:42:53 心理学家认为,判断男女两个人是否适合“牵手”,应考虑以下10个因素: 第一、彼此都是对方的好朋友,不带任何条件,喜欢与对方在一起; 第二、彼此很容易沟通、互相可以很敞开地坦白任何事情,而不必担心被对方怀疑或轻视; 第三、两人在心灵上有共同的理念和价值观,并且对这些观念有清楚的认识与追求; 第四、双方都认为婚姻是一辈子的事,而且双方(特别强调“双方”)都坚定地愿意委身在这个长期的婚姻关系中; 第五、当发生冲突或争执的时候可以一起来解决,而不是等以后来发作; 第六、相处可以彼此逗趣,常有欢笑,在生活中许多方面都会以幽默相待; 第七、彼此非常了解,并且接纳对方,当知道对方了解了自己的优点和缺点后,仍然确信被他所接纳; 第八、从最了解你、也是你最信任的对方处得到支持的肯定; 第九、有时会有浪漫的感情,但绝大多数的时候,你们的相处是非常满足而且是自由自在的; 第十、有一个非常理性和成熟的交往,并且双方都能感受到,在许多不同的层面上你们是很相配的;   爱情最常见的形式就是两性之间的捕捉与追逐。人际间的好感可以相互传达出强大的力量,以至于能够弥补客观条件的不足。是相似性而非互补性把人们结合到了一起。相似性主要包括三个方面的匹配度:价值观与人格、兴趣和经验、人际风格。其中,人际风格是最重要的关系预测指标。与和自己人际沟通风格有所差异的人交往会有挫折感,且较少有进一步发展的可能。   爱情是追到手的吗? 不是。真正的感情根本不需要追的。两个人的默契,在慢慢将两颗心的距离缩短,在无意识中渐渐靠近彼此。从好朋友到情人,真正的感情是用不了多久的。从你喜欢上他的那一刻起,也许他也在那一刻喜欢上了你。同节奏的爱情往往能奏出最和谐最动听的乐章。   真正的爱情需要什么? 需要两个人在一起是轻松快乐的,没有压力。   爱一个人就是毫无保留地付出吗? 不是。每一个人都是一个独立的人,我们首先是属于自己的,我们有思想,我们有个性,而不是把我们的全部都给对方。我们可以有保留,比如你不愿意说的隐私,有秘密的人才是成熟的,不是吗?有时候不说出来反而更好。   外貌和个性哪个更重要? 男人年轻的时候往往喜欢漂亮的女子,25岁以后,会选择和自己性格合适的女子,能和自己一起过日子的人。   喜欢一个人,太急切了,反而不好。一是因为越想得到的越得不到;二是得到了也很难珍惜,来得快去得也快。细水长流一些,爱情会更长久。   相爱容易相处难。相处中最重要的是宽容和妥协,在信任和了解的基础上。没有宽容和妥协,任何两个人都无法相处。   纯纯的爱也许只有一次,但是真爱未必只有一次。时间会抚平一切伤痕。   我们其实是可以爱上很多人的。我们不是喜欢某个人,而是喜欢某种类型的人。先来的人和我们相遇了,于是我们幸福地走到了一起;对于后到的人,只能抱以歉意,同时,祝福他早日找到属于他自己的幸福。   没有谁是我们一生非拥有不可的,爱一个人,很多时候实际上是习惯了这个人。   现实和浪漫哪个更重要? 现实。没有现实为基础,浪漫就是空中楼阁。大学校园的爱情往往随着毕业而告终,大多是因为不现实,不在一个城市。 只有相互欣赏相互佩服各有所长的人,才会碰撞出最美丽的火花,也才会结出最甜美的爱情果实。   分手后我们还可以做朋友吗? 最好不要。剪不断,理还乱。过去了就过去了,我们不是生活在过去,而是现在。爱情不等于生活,只是生活的一部分。   不要因为自己长相不如对方而放弃追求的打算,长相只是一时的印象,真正决定能否结合主要取决于双方的性格。我见过的帅哥配丑女,丑女配帅哥的太多了。   恋爱的时间能长尽量长。这最少有两点好处:一,充分、尽可能长的享受恋爱的愉悦,二,两人相处时间越长,越能检验彼此是否真心,越能看出两人性格是否合得来。   想知道一个人爱不爱你,就看他和你在一起有没有活力,开不开心,有就是爱,没有就是不爱。   爱情不是感动,你不是他心目中的理想伴侣,即使一时接受你,将来碰上他心仪的那一位,一样会离开你。有些人情绪容易大起大落,这样的人是很难维持一段长久的关系的。   浪漫是什么? 是送花?雨中漫步?楼前伫立不去?如果两人彼此倾心相爱,什么事都不做,静静相对都会感觉是浪漫的。否则,即使两人坐到月亮上拍拖,也是感觉不到浪漫的。   是否门当户对不要紧,最重要应该是兴当趣对,不然没有共同语言,即使在一起,仍然会感觉到孤独。…


时间真就像滔滔江水一般飞逝不息,一不留神就到了2015年的最后一天。 先祝母上生日快乐吧。母亲大人辛苦;家中的事我求学在外帮不上忙,新的一年,希望闲暇时候能在家多陪陪她,也算是孝道。 过去一年里最大的事大概是打定了主意出国吧。前后在美国呆过六个月左右,它吸引我的地方大概和令我生厌的地方一样不可忽略。然而祖国种种令人嫌弃的现实之外,同样夹杂着叫人难以割舍的东西。最终令我打定主意的,还是机不可失时不再来这句话。趁我还年轻,我父母还年轻,抓紧机会出去看看。错过了,再想去国外读书,就难上加难了。 这一年在汪老师的指导和戴导的帮助之下,科研方面算是多少搞出一点名堂。明年还有半年时间可以继续聆听老师和师兄师姐们的教诲,希望能把今年挖的坑填个差不多。 坐在网管大人旁边,让我有幸认识了许多TUNA的大神,也增长了许多恣肆。可惜金枪鱼的晚上我基本上都忙着自己的事情,好不容易上个礼拜有点时间还赶上某个会玩的系学生节,只好明年再找机会和TUNAers共度大鹰之夜了。 说到加入组织,拿到这世界规模最大的组织的投名状,也算是大事一件了吧。虽然现实有多么骨感大家有目共睹,但至少拿到台面上讲的理论和政策是好的是积极的。相比傻了吧唧地相信什么用来打嘴炮的空话,我更倾向于坚持读了一点东西以后我自己用脑子得出的看法。希望明年可以顺利入伙,再接再厉多多学习,也好让自己再深刻一点。 时间过得快呀,一转眼本科就要进入尾声了。仔细想想,大一刚入学时候给自己的承诺,还算都勉强守住了。关于未来,我是希望自己可以胸有成竹地立下flag,可是稍微走点心就知道时间会多么轻而易举地把它们打破。那就珍惜现在吧,做好手边的事,享受眼前的生活,人在做,天在看,不管多难的事情,九九八十一难都经历过的话,总有一天能修成正果。况且,过程远比结果来得重要呢。 不絮叨了,结个尾吧。又到年关,家中的祖辈虽然还都尚在,却实实在在地一年比一年老迈了。看着我从毛头小孩长大的他们,如今真的开始变老了。讲真,时光时光慢些吧。 附上大一时候给自己立的flag。光阴还是虚度了不少的,执行力也差了一点;所幸还有半年,继续努力吧。 大学四年,我郑重承诺:绝不虚度光阴,绝不徘徊彳亍;谨记此八字箴言:博学,慎思,明辨,笃行;四年之后,就算物是人非,就算聚散无常,我也要给你一个更博大的自己,给你一个更成熟的自己,给你一个更坚强的自己:一个让我更自信的自己。




找签证路线的时候发现谷歌地图有一个打印功能简直贴心(图片可以戳开看原图,会打开新的标签页): 别人家的地图就是好用啊! 相比之下,看看咱自己家(?)地图的打印功能:




你为啥还在用Windows啊? 网管问我。 对啊我为啥还在用Windows啊……我也不知道……还真没想过……曾经尝试用Linux做主力系统,卒。然后就一直Windows到现在。看着网管手中高大上的Arch Linux玩得是风生水起,我不禁开始思考起这个深刻的哲学问题了。 仔细想了想,大概的原因应该有这么几个吧: 穷。一直认为Mac OS X是最好用的操作系统,简(wú)单(nǎo),优(áng)雅(guì),最主要是和Linux关系好,好多东西通用。虽然说,并没有真正用过……加上手里这台老笔记本不争气,用了快四年了,除了保修期内换过一次散热片,一直没有别的问题,导致完全我没有借口换电脑…… 懒。毕竟历史遗留问题,这么多年以来接触的都是Windows。换Linux简直是对Google能力的大挑战,会遇到各种各样稀奇古怪的问题,上次做主力系统的Ubuntu(严格来说是Elementary OS)就是一不小心升级了一下内核然后显卡驱动跪掉。有搞定这么多问题的时间,我还不如短平快地装个Windows,DUANG~ Safe and sound. 于是,一用就是一年多,再也没有闲心折腾回Linux…… It works. 其实Windows挺好用的,特别是软件方面比Linux好找。像平常习惯用的微信,QQ音乐,uTorrent,PotPlayer,完全没有替代品。功能类似但不完全相同的不算,因为有一些细节的功能我就是放不下,类似软件里就是没有。而且生活在这样一个看脸的世界上,Linux上大部分软件实在是不能看,这怎么能忍。要想让Linux和Windows拥有一样的颜值,不知道要花上多少功夫呢(参见第二条)。当然Linux上有许多好用的东西,例如iptables,例如bash,但是权衡一下,还是Windows友好一点。而且Linux可以窝在Windows上一个小的虚拟机里干活,反过来就…… 没有那么强烈的程序员情怀吧。我是实用主义信仰,什么好用用什么。管他什么自由不自由,什么开源不开源,首先要能用,其次再考虑旁的问题。 所以吧……一直到现在,我还是在用Windows。没有什么意外的话,不(lǎn)会(dé)换了。或许当我真的用了一段时间Mac OS X以后发现他并不好用,说不定也会在Mac上装个Windows呢(hēhē)…… 然而Windows用过一段时间就不得不重装。现在的系统用了一年多已然是千疮百孔了……可是现在是期末啊!坑爹呐…… 偶然的机会在Arch上装了一个GNOME。也不那么难看嘛。要不要继续用Windows呢……   老笔记本已经四岁了,换上Windows 10接着用。





OpenWRT’s way

I’ve been using OpenWRT since 2012. For now I’ve been able to make it work under multiple environments, with or without native IPv6 support, bridged or NATed. By “work”, I mean both IPv4 and IPv6, with a reliable connection to the rest of the world. 这是计划的一部分。——罗辑 Note that you may need to have some prerequisite knowledge to read the this article, including…


想写这篇年志很久了,拖下去终究不是办法,还是写出来吧。 这一年最大的事情就是去了奥斯汀交换。这一去才知道,离家最远的距离不是坐八个小时火车才能回去,而是有十三个小时时差,家里的黑夜是这里的白天,国外的月光照不到我熟悉的白山黑水。爸妈说,有了时差,感觉离得格外远。 当年离开老家去省城上学的时候,那种撕心裂肺的感觉今天还清楚地记得。等高中毕业来到北京上大学,离别我早已习惯,只是思念的除了老家,又多了一个新家。等到远赴重洋,就连平日里不怎么待见的宿舍和食堂,也都烙上了“家”的印记。人最不能忘本;我又是个思旧的人,对家的记忆,写在骨头里,怎么能忘记呢。 然而在国外想家想得天昏地暗四个月,到头来却更坚定了离家出国读书的信念。不为别的,为了抬头能看见蓝蓝的天,为了低头能望见绿油油的草,为了放眼望去,满世界不都是人和车,阳光洒在地上而不是雾霾里,可以张开嘴大口呼吸,不用掏出手机看今天PM2.5是几。短短四个月,唤起多少记忆。小时候在老家,就是这样啊。还记得小学毕业那个夏天,天蓝得清灵又透亮。太阳是肆无忌惮地炙烤着的,老家虽然尘土飞扬却不必担心污染和尾气。 那以后几乎所有关于老家的记忆都变成在车里看风景了吧。省城和北京,都是常年看不着天,激光武器都打不下来的重污染地区。直到,踏上异国他乡的土地;说来好笑,为什么别人家的地盘,却总叫我想起自己家的记忆。唉,先出来躲上几年,等家里空气好了,再回去。 只是,不知道到了那时,说到家,会叫我想起那些记忆。

How do I surf the Internet

You guys know what I mean. Quite a few friends of mine asked me about this sort of thing. After a few days of study… I realized that it is not a trivial question. So I share some techniques I use. But first of all, I’d like to make it clear that the Intranet works the way it works for…

Official Start of My Blog

So I guess this is pretty much it. A personal blog owned and managed by me and only by me. Here I’d like to share some other people’s words, as well as some notes on what I’ve done and maybe some of my own ideas. Hopefully it’ll be helpful not only for myself but also for others. That’s all. Blaok