之前零零散散写过一些经验分享的文章,不系统,对读者也不友好。现在整理到一块,随时更新,如果值得深入还可以单独写文章。主要针对自由/开源软件,也可能涉及科学软件、商业软件。

目标:今年整理50条在中文圈里稀罕的小技巧。

2017-12-20 Update: 跌跌撞撞,我写完了50条经验。

2018-01-03 Update: 进行了归类,想办法转载看能不能收获更多访问。

一句话系列的另外两篇:我的一句话经验——Emacs Lisp篇一句话系列——冷知识篇

*NIX世界命令行使用技巧

主要是使用和写脚本的经验,带例子。

  1. Grep可以用--include="*.md"指定搜索的文件类型,比如grep Chris -r . --include="*.md",在当前目录递归的检索*.md文件中的“Chris”。

  2. 7-Zip的-r会递归的在目录里搜索指定的路径,而不是我们期望的在指定目录中递归,所以不要用。详解

  3. 多进程使用下载工具wget的方法:cat /tmp/url.txt | xargs -n 1 -P 8 wget -c;url.txt里一行一个地址,-P 8表示最多同时运行8个进程,相比加&后台运行的方法可以指定进程数。更好的方法是用parallel,例子见下面。

  4. *NIX世界的cut命令很好用,有时候比正则好用,而且可以写一些比较“dirty”的代码。

  5. Bash中如果要实现某条指令成功后再并行运行几条命令,可以这样写:echo && { sleep 12 & sleep 12 & }; wait; echo && { sleep 12 & sleep 12 &};

  6. grep -o可以只显示匹配的部分。

  7. 将URL保存到文件后用wget的-i参数批量下载,比如wget -i ./list.txt

  8. Linux里有一个/usr/bin/timeout命令可以让程序超时退出,用法是/usr/bin/timeout 1m ts,就是执行1分钟后就kill掉,在写cron命令时很方便。如果没有这个命令,对于Debian系列的系统可以安装名为timeout的包。来源

  9. date +%j可以告诉你今天是一年中的第多少天,对于算天数非常有用。date的手册

  10. 写Bash脚本的好参考:
    progrium/bashstyle
    以及一个小教程
    Ten Things I Wish I’d Known About bash

  11. 从第三行输出文件内容可以用awk实现:awk 'NR>=3' "aaa.xyz"

  12. GNU Parallel并行执行命令很方便,一些实例

1
2
3
parallel echo {} + 1 is {= '$_++' =} ::: {1..10}
time parallel -N0 -j4 sleep 1 ::: {1..10}
ls | parallel 'cd {}; grep Chris *.out'

注意,parallel会把你的输入放到命令行里,所以上面的命令如果不加-N0会睡很长时间。另外parallel在Android的termux环境中需设置环境变量PARALLEL_SHELL

  1. Linux的字符终端(TTY)可以旋转,方法是echo 1 | sudo tee /sys/class/graphics/fbcon/rotate_all,注意如果sudo echo 1 > /sys/class/graphics/fbcon/rotate_all是不行的。

  2. Bash里<()的含义是:括号内的代码的输出被重定向到一个文件/dev/fd/63。执行cat <(ls)就得到了ls的输出,执行echo <(ls)得到了文件名。这个/dev/fd/63是一个命名管道(named pipe),一切皆文件嘛,就当一个文件使。参考

  3. 对于v1.06以上版本的GNU bc,设置BC_LINE_LENGTH可以控制自动断行的特性,例子

1
BC_LINE_LENGTH=0 bc -l <<< "scale = 100; a(1) * 4"
  1. 上一条技巧里的<<<是“Here Strings”,Bash等shell才有,sh里没有,bc -l <<< "scale = 100; a(1) * 4"等价于echo "scale = 100; a(1) * 4" | bc -l,但前者速度快很多。参考。测速代码
1
2
time for i in {1..10000}; do echo "" | : ; done # 84s
time for i in {1..10000}; do : <<< ""; done # 5s
  1. 除了nohupsetsid也可以在不受登出影响在后台运行程序。参考

  2. 批量后缀名修改:find . -name "*.txt" -exec rename .txt .md {} \;,把所有的*.txt替换为*.md,包括子目录的文件。注意这里用到了rename命令,来自util-linux包。

  3. sort命令其实非常强大,比如对一个「表格」进行排序:

1
2
3
4
5
6
7
8
9
$ cat a.txt
张三 96
李四 60
王二 100

$ sort -k2 -n a.txt
李四 60
张三 96
王二 100

这里是根据第二列的值对行进行排序。我以前只知道sort可以行排序,现在会根据指定的列排序,用Excel的理由又少了一个。

  1. 接上面一条,Coreutils里的join可以连接表格,比如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ cat a.txt
姓名 成绩1
张三 90
李四 80
王二 100

$ (head -n 1 a.txt && tail -n +2 a.txt | sort) > a.txt.sorted
$ cat a.txt.sorted
姓名 成绩1
李四 80
王二 100
张三 90

$ cat b.txt
姓名 成绩2
张三 92
李四 90
王二 90

$ (head -n 1 b.txt && tail -n +2 b.txt | sort) > b.txt.sorted
$ cat b.txt.sorted
姓名 成绩2
李四 90
王二 90
张三 92

$ join a.txt.sorted b.txt.sorted > c
$ cat c
姓名 成绩1 成绩2
李四 80 90
王二 100 90
张三 90 92

上面的代码还演示了如何在排序的时候保留第一行。更多的解释请看join的手册

  1. 可以用awk进行「转置」,把列变成行,方法是设置ORS,控制的是输出的间隔符,设为空格就把列连接起来了。比如用上面的数据,对第一列进行转置,借助Emacs的M-|,代码是:
1
awk 'BEGIN{ORS=" "} {print $1}'
  1. 比如我有一列姓名,我想知道每个人出现的次数,怎么办呢?实例输入文件如下:
1
2
3
4
5
李四
王二
张三
李四
李四

可以借助sort和uniq再加上awk很方便的进行处理:`sort | uniq -c | sort -k1 | awk ‘{print $2 “\t” $1}’,结果如下:

1
2
3
王二	1
张三 1
李四 3
  1. 如何只复制指定的文件并且保留文件夹结构:rsync -rv E5internet:/tmp/screening/ /tmp/ --include="*/" --include="a.xyz" --exclude="*"

自由/开源软件使用经验

  1. 对于大规模的搜索,简单的把grep命令换成ag (当然前提是安装了这个软件),可以大幅加速搜索速度。还有一个最新的软件ripgrep,据称比ag (The Silver Searcher)更快。

  2. Fontconfig的配置文件推荐放在~/.config/fontconfig/fonts.conf里,放在别处是废弃的用法,可能导致出错。

  3. Cron脚本不执行的一个可能的原因:Cron脚本不能包含后缀名,如果你不确定写的对不对,可以用run-parts --test /etc/cron.monthly/测试一下。askubuntu上的解答

  4. Markdown中,用#.代表编号只在pandoc中支持,不要期望它在其他地方获得支持,对于非pandoc的情况用传统的1.是正道。

  5. Shadowsocks在服务端打开一次性认证的方法是在配置文件中加入"auth":true详解

  6. MPV如果要批量播放视频,可以在视频所在目录里运行mpv *

  7. 可以用ffmpeg合并视频,一个例子是:

1
ffmpeg -i "Cloud.Atlas.2012.RUS.Blu-Ray.1080p.AC3.x264.mkv" -i "Cloud.Atlas.2012.English.Audio.AC3.DD5.1.448K.Angrybirdy@CHD.ac3" -c copy -map 0:0 -map 1:0 out.mkv
  1. Shadowsocks的“ss-stunnel”是用来进行转发的,数据走的是Shadowsocks的协议,用法类似ss-tunnel.exe -u -c "C:/msys64/etc/shadowsocks/config.json" -L "8.8.8.8:53" -l 53,实现在本地的53端口起一个DNS服务器,而DNS的解析被转发到谷歌的DNS。

  2. 用Shadowsocks时,如果想把代理分享给局域网的其他电脑,可以在配置文件中加入"local_address":"0.0.0.0",这样代理的本地端口就暴露给局域网的其他电脑了。注意这里可能会弹出防火墙的窗口。

  3. 开启MPV硬件加速的方法:在配置文件里写入hwdec=auto。对于Windows,配置文件是%appdata%/mpv/mpv.conf

  4. 文档转换的瑞士军刀pandoc的每夜版(nightly)下载地址,每夜版会修复一些现有版本的Bug。

  5. Windows下小巧好用的PDF阅读器SumatraPDF的抢鲜版(prelease)下载地址新版标记功能的介绍

  6. Pandoc的reference-docxreference-odt参数统一到reference-doc参数上了。

  7. Linux平台下,54.x版本以上的Firefox必须安装PulseAudio才能听到声音,命令是sudo pacman -S pulseaudio pulseaudio-alsa

  8. MacType的最新版(v1.2017.628.0)中,如果使用了DirectWrite支持(即DirectWrite=1),那么,[DirectWrite]中最好RenderingMode=6,否则用DirectWrite的软件,比如Word 2013,效果会非常差。

  9. 好奇的你可以用objdump -d emacs来反汇编某个程序看里面的秘密,如果你喜欢Intel的汇编语法,可以用objdump -M intel -d emacs

  10. 用GCC的时候在CFLAGS加上-ftree-vectorize自动向量化代码。想知道哪些代码被自动优化了?再加上-fopt-info优化的指示就会输出到stderr,用2> /tmp/err.log把它们输出到文件仔细研究吧。

  11. curl是比较容易使用Socks5代理的,用--socks5-hostname参数就可以,示例

1
curl https://chriszheng.science/index.html --socks5-hostname localhost:65500 -O
  1. UnZip可以解压百度网盘批量下载的zip压缩包,7-zip不行,WinRAR的修复功能也可以让压缩包正常解压。

  2. AndroidScreencast可以在电脑上操作安卓手机,而且不需要手机上装软件,原理是用ADB。当然,非常不好用,延迟达到秒级,玩玩就好。

  3. 如果Node的包管理出现问题,可以用激进的方法删除node_modules重新安装。对于*nix系统rm -rf node_modules就可以,在Windows下可能会删除不掉,可以安装在Windows下实现“rm -rf”的包rimrafnpm install rimraf -g,然后rimraf node_modules注意,这个包的功能是rm -rf哦。

  4. Hexo的包hexo-filter-cleanup在调试模式不会生效。我一直疑惑为什么调试模式生成的快,原来是因为调试模式不会优化,所以快了很多。

  5. 编辑/etc/fstab的时候一定要慎重,因为启动的时候系统会默认挂这些分区,如果找不到,启动失败。

  6. MPV如果不想要看输出可以加参数--no-terminal

  7. 用Emacs的Tramp连接到运行BusyBox的路由时会遇到连不上的问题,在路由上安装coreutils-stty就好啦。原因是因为精简的BusyBox很可能不带stty命令,而Tramp又依赖它,所以反复出错。

  8. 衍生自Firefox的浏览器K-Meleon会连接到官网自动更新,如果官网挂了,比如像今天这样,软件就会崩溃。禁用自动更新就好了,禁用方法是偏好设置→K-Meleon插件中禁用检查更新

  9. 最近用上了tmux,有种相见恨晚的感觉,以下两条配置很好用,可以放到~/.tmux.conf

1
2
set -g mouse on
set -g status-right ' #{?client_prefix,#[reverse]<Prefix>#[noreverse] ,}"#{=21:pane_title}" %H:%M %d-%b-%y'

来源1来源2

  1. Windows下使用Firefox还是必须得用Flash,而第三方修改过的Flash比原始版的好。火狐吧的文科一直维护去沙箱版Flash,下载地址
    https://pan.baidu.com/s/1boVSQXx#list/path=%2F
    另外一位朋友维护的
    https://bbs.kafan.cn/thread-1839722-1-1.html

  2. 开源看图软件nomacs还挺好用。

科学相关软件技巧

  1. ORCA计算金属配合物遇到SCF不收敛的情况,可以使用! SlowConv,如果不行可以试试! KDIIS更多信息

  2. Octave里在向量最后增加一个元素的写法是a(end + 1) = 5;,删除最后一个元素的写法是a(end) = [];手册里的解释

  3. AutoDock Vina输出结果的平均值,:

1
(for f in *.log; do 	echo -n "${f}: "; 	awk '/^[ ]+[1-9]+/ {n++;sum+=$2} END {print n?sum/n:0}' ${f}; done) > /tmp/a.log
  1. When Octave fail to plot a figure, run the magical close all. I struggled with this issue for a long time.
    如果Octave的画图功能不能正常工作,运行神奇的close all。这个问题困扰我很久了,只有在Emacs里用Octave才会遇到。这条经验也分享到help-octave邮件列表了

  2. 从兼容性方面考虑,Octave导出SVG格式的图片是比较好的选择,缺点是不太好编辑了。话说回来,PostScript也不是为了编辑而产生了。

商业软件技巧

  1. 对于MIUI 8,开启开发者模式后,选择不使用锁屏界面,就不用看锁屏画报了。我之前写过

  2. 在MS Word中,=rand(8, 10)可以生成随机的文字,=lorem(8, 10)生成的是Lorem ipsum。详解

  3. MS Word里用Ctrl + *(实际是Ctrl + Shift + 8)可以显示额外的格式符号,比如空格用·表示,对于一些编辑工作可能有用。(Emacs里等价的功能是M-x whitespace-mode)。

  4. 永久性的将Word的宏转为文字:Ctrl+Shift+F9出处

  5. Acrobat XI的11.0.1以上版才能和Word 2013兼容,直接安装的11.0.0是不行的,必须先升级。各版本的兼容情况

  6. 要想在Windows下使用UTF-8的,要么用Emacs等软件,通过管道传递,要么就在命令提示符里用chcp改代码页(chcp 65001),直接用使用命令,包括API调用,肯定会失败。在MS-Windows平台下使用UTF-8编码

  7. Word的选项里面,显示-打印选项里面,有“打印文档属性”一项,如果选上了,打印的时候会多一页,一定不要选。这个毛病非常难以排查,设置的位置又非常隐秘。

网络相关技巧

  1. 为了移动端友好没有必要在robots.txt中禁止抓取CSS等文件。详解

  2. 同一个域名下混合使用HTTP和HTTPS会导致很多问题,不要这样。一个我的折腾实例

  3. 批量复制URL的Firefox扩展Copy Link URL

  4. 网站https://gtmetrix.com/可以对网页进行测速,方便优化网站。谷歌的PageSpeed Insights也是个好工具。

软硬件折腾

  1. 除非有好的设备并且非常认真听,320 Kbps的音质已经足够好了。我的经验

  2. Wifi常见的协议按从旧到新的顺序是:802.11b < 802.11g < 802.11n < 802.11ac,目前802.11ac就是比较新协议了。

  3. 一些无线网卡,比如我用的比较坑的Intel的N 2230,会出现使用802.11n不稳定的情况,这种时候可以在网卡的设置里面禁用802.11n协议,这样速度会慢一些(理论最大速度下载速度从37 M/s降低到6 M/s),稳定性会有很大的提升,而且大多数时候出口带宽没有那么高(也就是说你的下载速度根本就不会大于6 M/s),就算协议能支持也对你没有用。这条经验比较啰嗦,希望看的人能明白。

  4. Intel Core架构的顺序是:Nehalem、Sandy Bridge、Ivy Bridge、Haswell、Broadwell、Skylake、Kaby Lake。出处

  5. 今天解答了我4年前在笔记本上装双系统的一个疑惑:如果电脑是以Legacy模式引导的,那么Windows的安装程序只能安装到MBR分区上,而以UEFI模式时只能安装到GPT分区上,即BIOS–MBR以及UEFI–GPT是绑定的,二选一。这是Windows的限制。出处