我的一句话经验——软件篇
之前零零散散写过一些经验分享的文章,不系统,对读者也不友好。现在整理到一块,随时更新,如果值得深入还可以单独写文章。主要针对自由/开源软件,也可能涉及科学软件、商业软件。
目标:今年整理50条在中文圈里稀罕的小技巧。
2017-12-20 Update: 跌跌撞撞,我写完了50条经验。
2018-01-03 Update: 进行了归类,想办法转载看能不能收获更多访问。
一句话系列的另外两篇:我的一句话经验——Emacs Lisp篇、一句话系列——冷知识篇。
*NIX世界命令行使用技巧
主要是使用和写脚本的经验,带例子。
Grep可以用
--include="*.md"
指定搜索的文件类型,比如grep Chris -r . --include="*.md"
,在当前目录递归的检索*.md
文件中的“Chris”。7-Zip的
-r
会递归的在目录里搜索指定的路径,而不是我们期望的在指定目录中递归,所以不要用。详解。多进程使用下载工具wget的方法:
cat /tmp/url.txt | xargs -n 1 -P 8 wget -c;
,url.txt
里一行一个地址,-P 8
表示最多同时运行8个进程,相比加&
后台运行的方法可以指定进程数。更好的方法是用parallel
,例子见下面。*NIX世界的cut命令很好用,有时候比正则好用,而且可以写一些比较“dirty”的代码。
Bash中如果要实现某条指令成功后再并行运行几条命令,可以这样写:
echo && { sleep 12 & sleep 12 & }; wait; echo && { sleep 12 & sleep 12 &};
。grep -o
可以只显示匹配的部分。将URL保存到文件后用wget的
-i
参数批量下载,比如wget -i ./list.txt
。Linux里有一个
/usr/bin/timeout
命令可以让程序超时退出,用法是/usr/bin/timeout 1m ts
,就是执行1分钟后就kill掉,在写cron命令时很方便。如果没有这个命令,对于Debian系列的系统可以安装名为timeout
的包。来源。用
date +%j
可以告诉你今天是一年中的第多少天,对于算天数非常有用。date的手册。写Bash脚本的好参考:
progrium/bashstyle
以及一个小教程
Ten Things I Wish I’d Known About bash
我觉得最有用也最不容易记住的是变量替换上面的第二个链接告诉我们单引号
''
不会做替换,而双引号""
会替换。我们一般写sed
和awk
命令都用单引号,就是不希望我们的代码被替换,可有时候我恰恰需要替换,这时候换用双引号就好了,请看示例代码
1 | Etdl=$(grep "FINAL SINGLE POINT ENERGY" /data/qm/B97-3c/a.out | tail -n1 | awk '{print $(NF)}') |
演示了如何把内容附加到每行后面。
从第三行输出文件内容可以用awk实现:
awk 'NR>=3' "aaa.xyz"
。GNU Parallel并行执行命令很方便,一些实例
1 | parallel echo {} + 1 is {= '$_++' =} ::: {1..10} |
注意,parallel会把你的输入放到命令行里,所以上面的命令如果不加-N0
会睡很长时间。另外parallel在Android的termux环境中需设置环境变量PARALLEL_SHELL
。
- Linux的字符终端(TTY)可以旋转,方法是
1 | echo 1 | sudo tee /sys/class/graphics/fbcon/rotate_all |
注意下面这种写法不行。
1 | sudo echo 1 > /sys/class/graphics/fbcon/rotate_all |
Bash里
<()
的含义是:括号内的代码的输出被重定向到一个文件/dev/fd/63
。执行cat <(ls)
就得到了ls
的输出,执行echo <(ls)
得到了文件名。这个/dev/fd/63
是一个命名管道(named pipe),一切皆文件嘛,就当一个文件使。参考。对于v1.06以上版本的GNU bc,设置
BC_LINE_LENGTH
可以控制自动断行的特性,例子
1 | BC_LINE_LENGTH=0 bc -l <<< "scale = 100; a(1) * 4" |
- 上一条技巧里的
<<<
是“Here Strings”,Bash等shell才有,sh里没有,bc -l <<< "scale = 100; a(1) * 4"
等价于echo "scale = 100; a(1) * 4" | bc -l
,但前者速度快很多。参考。测速代码
1 | time for i in {1..10000}; do echo "" | : ; done # 84s |
除了
nohup
,setsid
也可以在不受登出影响在后台运行程序。参考。批量后缀名修改:
find . -name "*.txt" -exec rename .txt .md {} \;
,把所有的*.txt
替换为*.md
,包括子目录的文件。注意这里用到了rename
命令,来自util-linux
包。sort
命令其实非常强大,比如对一个「表格」进行排序:
1 | $ cat a.txt |
这里是根据第二列的值对行进行排序。我以前只知道sort
可以行排序,现在会根据指定的列排序,用Excel的理由又少了一个。
- 接上面一条,Coreutils里的join可以连接表格,比如
1 | $ cat a.txt |
上面的代码还演示了如何在排序的时候保留第一行。更多的解释请看join的手册。
- 可以用awk进行「转置」,把列变成行,方法是设置
ORS
,控制的是输出的间隔符,设为空格就把列连接起来了。比如用上面的数据,对第一列进行转置,借助Emacs的M-|
,代码是:
1 | awk 'BEGIN{ORS=" "} {print $1}' |
- 比如我有一列姓名,我想知道每个人出现的次数,怎么办呢?实例输入文件如下:
1 | 李四 |
可以借助sort和uniq再加上awk很方便的进行处理:`sort | uniq -c | sort -k1 | awk ‘{print $2 “\t” $1}’,结果如下:
1 | 王二 1 |
- 如何只复制指定的文件并且保留文件夹结构:
1 | rsync -rv E5internet:/tmp/screening/ /tmp/ --include="*/" --include="a.xyz" --exclude="*" |
保留一些文件,删除其他所有文件:
find . -type f -not -name 'a.xyz' -delete
。批量生成MD5校验的方法:
find /data/ -type f -exec md5sum {} \; > /tmp/list.txt
。来源。找大文件并且显示文件大小:
find . -size +100M -exec du -h {} \; | sort -k1hr
。awk '/^>./ {printf("\n%s\n", $1)} ! /^>./ {printf("%s", $1)}' unigene.fasta > unigene.fasta.nonewline
。对目录按大小排序:
du -h -d 1 | sort -k1hr
。Arch Linux滚动更新后,强制装载新的USB驱动,不拔优盘直接起效。来源。
1 | sudo modprobe -r usb-storage |
- 成对替换可以用Coreutils里的
tr
,比如tr 'abcd' 'jkmn'
,缺点是不支持UTF-8,一上中文就完蛋。这个需求可以用sed
实现,比如sed 'y/“”/「」/'
。来源。
自由/开源软件使用经验
对于大规模的搜索,简单的把
grep
命令换成ag
(当然前提是安装了这个软件),可以大幅加速搜索速度。还有一个最新的软件ripgrep,据称比ag (The Silver Searcher)更快。Fontconfig的配置文件推荐放在
~/.config/fontconfig/fonts.conf
里,放在别处是废弃的用法,可能导致出错。Cron脚本不执行的一个可能的原因:Cron脚本不能包含后缀名,如果你不确定写的对不对,可以用
run-parts --test /etc/cron.monthly/
测试一下。askubuntu上的解答。Markdown中,用
#.
代表编号只在pandoc中支持,不要期望它在其他地方获得支持,对于非pandoc的情况用传统的1.
是正道。MPV如果要批量播放视频,可以在视频所在目录里运行
mpv *
。可以用ffmpeg合并视频,一个例子是:
1 | ffmpeg -i "Cloud.Atlas.2012.RUS.Blu-Ray.1080p.AC3.x264.mkv" -i "[email protected]" -c copy -map 0:0 -map 1:0 out.mkv |
.ts
视频可以直接用cat
合并。更多关于合并视频的知识。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。用Shadowsocks时,如果想把代理分享给局域网的其他电脑,可以在配置文件中加入
"local_address":"0.0.0.0"
,这样代理的本地端口就暴露给局域网的其他电脑了。注意这里可能会弹出防火墙的窗口。开启MPV硬件加速的方法:在配置文件里写入
hwdec=auto
。对于Windows,配置文件是%appdata%/mpv/mpv.conf
。文档转换的瑞士军刀pandoc的每夜版(nightly)下载地址,每夜版会修复一些现有版本的Bug。
Pandoc的
reference-docx
和reference-odt
参数统一到reference-doc
参数上了。Linux平台下,54.x版本以上的Firefox必须安装PulseAudio才能听到声音,命令是
sudo pacman -S pulseaudio pulseaudio-alsa
。MacType的最新版(v1.2017.628.0)中,如果使用了DirectWrite支持(即
DirectWrite=1
),那么,[DirectWrite]
中最好RenderingMode=6
,否则用DirectWrite的软件,比如Word 2013,效果会非常差。好奇的你可以用
objdump -d emacs
来反汇编某个程序看里面的秘密,如果你喜欢Intel的汇编语法,可以用objdump -M intel -d emacs
。用GCC的时候在
CFLAGS
加上-ftree-vectorize
自动向量化代码。想知道哪些代码被自动优化了?再加上-fopt-info
优化的指示就会输出到stderr,用2> /tmp/err.log
把它们输出到文件仔细研究吧。curl是比较容易使用Socks5代理的,用
--socks5-hostname
参数就可以,示例
1 | curl https://chriszheng.science/index.html --socks5-hostname localhost:65500 -O |
用代理
git clone
的方法:ALL_PROXY=socks5://127.0.0.1:65500 git clone https://github.com/neomutt/neomutt
。UnZip可以解压百度网盘批量下载的zip压缩包,7-zip不行,WinRAR的修复功能也可以让压缩包正常解压。
AndroidScreencast可以在电脑上操作安卓手机,而且不需要手机上装软件,原理是用ADB。当然,非常不好用,延迟达到秒级,玩玩就好。
接上条,CXTouch速度更快,需要在手机上安装软件。
更快的是scrcpy。
如果Node的包管理出现问题,可以用激进的方法删除
node_modules
重新安装。对于*nix系统rm -rf node_modules
就可以,在Windows下可能会删除不掉,可以安装在Windows下实现“rm -rf”的包rimraf:npm install rimraf -g
,然后rimraf node_modules
。注意,这个包的功能是rm -rf
哦。Hexo的包hexo-filter-cleanup在调试模式不会生效。我一直疑惑为什么调试模式生成的快,原来是因为调试模式不会优化,所以快了很多。
编辑
/etc/fstab
的时候一定要慎重,因为启动的时候系统会默认挂这些分区,如果找不到,启动失败。MPV如果不想要看输出可以加参数
--no-terminal
。用Emacs的Tramp连接到运行BusyBox的路由时会遇到连不上的问题,在路由上安装
coreutils-stty
就好啦。原因是因为精简的BusyBox很可能不带stty
命令,而Tramp又依赖它,所以反复出错。衍生自Firefox的浏览器K-Meleon会连接到官网自动更新,如果官网挂了,比如像今天这样,软件就会崩溃。禁用自动更新就好了,禁用方法是
偏好设置→K-Meleon插件
中禁用检查更新
。最近用上了tmux,有种相见恨晚的感觉,以下两条配置很好用,可以放到
~/.tmux.conf
1 | set -g mouse on |
Windows下使用Firefox还是必须得用Flash,而第三方修改过的Flash比原始版的好。火狐吧的文科一直维护去沙箱版Flash,下载地址
https://pan.baidu.com/s/1boVSQXx#list/path=%2F
另外一位朋友维护的
https://bbs.kafan.cn/thread-1839722-1-1.html开源看图软件nomacs还挺好用。
让Termux不震动的方法是改配置,方法见配置文件的手册。
在Windows环境下使用mutt看HTML邮件:
1 | # ~/.mutt/muttrc |
- ImageMagick可以重设图片的DPI,方法是
1 | convert -units PixelsPerInch 输入图片.png -density 600 -trim 输出图片名.png |
顺带演示了-trim
去白边。
Git可以用
.git/info/exclude
代替.gitignore
来忽略本地文件,这种方法不必提交到远程。来源。下载用于win64平台的最新版Firefox:
https://download.mozilla.org/?product=firefox-latest&os=win64&lang=zh-CN正确的用ffmpeg截取视频的方法:
1 | ffmpeg.exe -ss 1:8:57 -i "阿凡达 Avatar Extended Collector's Edition 2009 BluRay 1080p DTS x264-CnSCG.mkv" -t 12 -c copy a.mkv |
注意,这里必须写时间长度,用-t
。
如果VirtualBox的VDI文件是动态大小,占用空间变大了,可以在虚拟机的系统里用SDelete命令清理自由空间:
sdelete.exe c: -z
,然后用VBoxManage的vboxmanage modifymedium --compact thedisk.vdi
来压缩。来源。ffmpeg合并字幕并且设为默认
1 | ffmpeg -i in.mp4 -i in.srt -c copy -disposition:s:0 default out.mkv |
来源。
统计汉字的字数
wc -m *.md
。抓取
m3u8
形式的在线视频:
1 | ffmpeg -user_agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/601.7.8 (KHTML, like Gecko) Version/9.1.3 Safari/537.86.7" -i http://185.38.12.60/sec/1503173737/363333397f6b65370bfc740ca4dea8c3f8dd2a93419f7748/ivs/12/b1/2ec5e15ba2a6/hls/tracks-4,5/index.m3u8 -c copy pd.mkv |
来源。
- 把图片转成视频:
1 | ffmpeg -framerate 12 -i "a_%03d.bmp" -vcodec libx264 -crf 1 -preset slow -vframes 1000 -pix_fmt yuv420p a.mp4 |
科学相关软件技巧
用ORCA计算金属配合物遇到SCF不收敛的情况,可以使用
! SlowConv
,如果不行可以试试! KDIIS
。更多信息。Octave里在向量最后增加一个元素的写法是
a(end + 1) = 5;
,删除最后一个元素的写法是a(end) = [];
。手册里的解释。求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 |
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邮件列表了。从兼容性方面考虑,Octave导出SVG格式的图片是比较好的选择,缺点是不太好编辑了。话说回来,PostScript也不是为了编辑而产生了。
用
mpif90
编译的时候会报Illegal preprocessor directive
,因为默认不进行预处理,FCFLAGS = -cpp
可以解决。Jmol/JSmol获取高质量截图:
write IMAGE 1920 1920 PNGT n "6.png"
。Octave里要用LaTeX语法必须用单引号,
xlabel('{\it d}(C–Cl) in Å')
。来源:手册里有,我觉得这句话应该强调。
商业软件技巧
在MS Word中,
=rand(8, 10)
可以生成随机的文字,=lorem(8, 10)
生成的是Lorem ipsum。详解。MS Word里用
Ctrl + *
(实际是Ctrl + Shift + 8
)可以显示额外的格式符号,比如空格用·
表示,对于一些编辑工作可能有用。(Emacs里等价的功能是M-x whitespace-mode
)。永久性的将Word的宏转为文字:
Ctrl+Shift+F9
。出处。Acrobat XI的11.0.1以上版才能和Word 2013兼容,直接安装的11.0.0是不行的,必须先升级。各版本的兼容情况。
要想在Windows下使用UTF-8的,要么用Emacs等软件,通过管道传递,要么就在命令提示符里用chcp改代码页(
chcp 65001
),直接用使用命令,包括API调用,肯定会失败。在MS-Windows平台下使用UTF-8编码。Word的选项里面,显示-打印选项里面,有“打印文档属性”一项,如果选上了,打印的时候会多一页,一定不要选。这个毛病非常难以排查,设置的位置又非常隐秘。
Excel怎么固定多个行和多个列呢?选中你要固定的行和列的「下一个」单元格,比如你想固定2行和1列,那么你应该选B3,然后视图-冻结窗口,就好了。如果我一直看百度出来的教程我是不会知道这个技巧的。
Excel里统计非空的列和行
=COUNTA()
。Word里不能插入特别大的图片。
小米的解锁工具带一个ADB驱动。官方提供的驱动签名都过期了。小米药丸。
Acrobat XI的PDFMaker插件在Word里不能加载,修复重装等方法是不行的,需要修改注册表
HKEY_CURRENT_USER\Software\Microsoft\Office\Word\Addins\PDFMaker.OfficeAddin
的LoadBehavior
,改成3,就好了。官方的解决方案。
移动端相关
对于MIUI 8,开启开发者模式后,选择不使用锁屏界面,就不用看锁屏画报了。我之前写过。
下载用于Android的最新版Firefox:
https://download.mozilla.org/?product=fennec-latest&os=android&lang=multi
网络相关技巧
为了移动端友好没有必要在robots.txt中禁止抓取CSS等文件。详解。
同一个域名下混合使用HTTP和HTTPS会导致很多问题,不要这样。一个我的折腾实例。
批量复制URL的Firefox扩展Copy Link URL。
网站https://gtmetrix.com/可以对网页进行测速,方便优化网站。谷歌的PageSpeed Insights也是个好工具。
可以通过添加
rel
确认你是链接的所有者,添加的链接类似这样<a rel="me" href="https://mastodon.sdf.org/@chriszheng">Mastodon</a>
,这样在Mastodon的资料页里链接会变绿。Firefox 60+版本移除了查看Cookie的功能,解决方案是用存储查看器,快捷键是
Shift+F9
。
软硬件折腾
除非有好的设备并且非常认真听,320 Kbps的音质已经足够好了。我的经验。
Wifi常见的协议按从旧到新的顺序是:
802.11b < 802.11g < 802.11n < 802.11ac
,目前802.11ac
就是比较新协议了。一些无线网卡,比如我用的比较坑的Intel的N 2230,会出现使用
802.11n
不稳定的情况,这种时候可以在网卡的设置里面禁用802.11n
协议,这样速度会慢一些(理论最大速度下载速度从37 M/s降低到6 M/s),稳定性会有很大的提升,而且大多数时候出口带宽没有那么高(也就是说你的下载速度根本就不会大于6 M/s),就算协议能支持也对你没有用。这条经验比较啰嗦,希望看的人能明白。Intel Core架构的顺序是:Nehalem、Sandy Bridge、Ivy Bridge、Haswell、Broadwell、Skylake、Kaby Lake。出处。
今天解答了我4年前在笔记本上装双系统的一个疑惑:如果电脑是以Legacy模式引导的,那么Windows的安装程序只能安装到MBR分区上,而以UEFI模式时只能安装到GPT分区上,即
BIOS–MBR
以及UEFI–GPT
是绑定的,二选一。这是Windows的限制。出处。
- 本文作者:Chris
- 本文链接:https://chriszheng.science/2017/01/02/One-sentence-tips-on-software/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明出处!