Sunday, January 25, 2015

一个常用开源工具的List

本来还想再写一篇介绍给《常用工具介绍》收个尾的,但是后来越来越觉得,详细介绍一个软件,实际上意义不大。因为开源工具每个工具的用途非常专一,每个工作又可以由不同的工具串联完成,再加上网上各个工具都有很多非常详尽的介绍,以我对每个工具的熟练程度,再要写一篇有意义的介绍,是很难的。然而回想自己几年来陆续接触各个软件的进程,觉得做一个list,不求仔细,只求让读到它的人了解到还有这么一个工具,或许对帮助他们打造更便捷的工作环境会有帮助。所以,那个系列的小文,就以这个list收尾好了。 

命令行shell:

    bash: 目前最流行的shell,基本每个linux,unix,mac OS X都会默认装有这个。虽说它已经有点老并在特色上比不上很多后来开发出来的shell,但至今还没有被取代的趋势。
    zsh:近段时间越来越流行的shell,比bash功能和可拓展性都强很多。不过因为上手比较麻烦,我对这个shell了解不多,只是在此提一下,有兴趣的可以多研究一下。
    fish:号称是90后们用的shell,英文的全称是Friendly Interactive SHell。如名字所言,它的默认设置就非常好用(汗一下zsh),一般都不需要你做什么特别的设置。让我印象最深的是它非常出色的自动补全能力。fish的补全算法不仅包含历史和当前文件夹以及PATH下的文件名搜索,还包括对当前命令的manual的检索。使得它的补全在命令的各个阶段都比较流畅。它的另一个特色是脚本,与你写完一个月之后自己都可能读不懂的shell script不同,fish的脚本通常非常容易读懂,但这同时也是它的缺点。fish的脚本用的是它自己开发的语言,而且并不符合POSIX标准,所以有时在使用shell工具时都会出现问题。这使得它的用户如果要流畅地对它进行设置或用联用几个不同的命令完成一个特定的工作时,也许会对它这点比较恼火。 


命令行下的多窗口系统:

    tmux:如果你还觉得一个terminal里一次只能运行一个命令,要同时运行多个命令只能开多个命令行窗口或者将正在运行的命令从当前的terminal脱离开才能做到的话,你out了。事实上很多年前就有一个叫做GNU Screen的软件可以在一个窗口里打开多个terminal window/pane。但是那个软件已经有很多年没有更新了,不仅在使用上不流畅,如果不打补丁只能水平地建立新的pane,对X以及一些新软件的支持也很有限。好在这个性质的软件被tmux很好地继承与拓展了。使用tmux可以非常轻松地在同一个terminal里建立多个session并且轻松切换,还可以从不同的terminal里打开同一个session,使用起来非常灵活。


文本编辑:

    vim:已经介绍了很长一篇了,最高效的文本编辑器,没有之一。
    emacs:应该也是一个相当不错的文本编辑器,只是因为meta键各个系统下都不一样然后我经常远程操作,这个软件我一直没用舒坦过。据说是一个假装自己是文本编辑器的操作系统(偷笑)。


远程登录:

    ssh:远程以命令行模式登录到其他电脑/服务器;
    sshfs:基于ssh协议的远程连接工具,可以将远程的文件夹直接加载到本地的一个文件夹里,然后操作会和操作本地文件一样便捷;
    sftp:和sshfs功能相似的工具,据一个用过的朋友说对他来说比sshfs好用,但我没用过。
    vncserver/vncviewer:严格地说这个软件和远程登录没有直接关系。vncserver可以根据你的设置建立一个桌面环境(gnome,KDE,xfce等),然后经这个桌面环境映射到一个特定的port。然后使用vncviewer连接到这个port就可以像操作虚拟机一样操作这个桌面环境。当然,与虚拟机不同的是,系统资源是不独立的,它只有桌面环境是独立的而已。然后,如果需要远程接到这个桌面环境,只需要在远程登录时,将这个port映射到本地的port。然后用本地的vncviewer接到那个port即可。它功能上基本相当于远程桌面,事实上比远程桌面更灵活。


数据备份/恢复:

    rsync:可以讲某个文件夹或整个硬盘,甚至是某个(默认由ssh协议接入的)服务器上你能访问到的内容备份到你指定的地址,可以是本地硬盘的某个地址,移动硬盘或者另一个服务器。当你再次进行备份时,rsync会比对两次备份时每个文件夹的time stamp,然后只将time stamp有变化的文件由新文件替代掉,老文件将会放在你指定的某一个老文件的文件夹里。在源地址不存在了的文件也会从备份里删除然后放在老文件的文件夹。所有的备份细节都可以自行设置,包括跳过文件和文件夹等,所以灵活度远比dropbox等服务要高。而且因为备份的地方是自己设置的的服务器/移动硬盘,所以基本不存在隐私泄漏的问题。缺点是因为设置复杂,通常需要用比较长的命令或写脚本来使用。我给自己和一个朋友写了一个小script来完成备份操作。代码host在github上,有兴趣的可以参考一下。 https://github.com/Ron89/env-config/blob/master/syncDoc


实用工具:

    python+numpy+scipy+matplotlib+ipythonpython是一个脚本语言,它的开发社区非常活跃,有各种各样的程序库(类似插件)完成不同的工作。比如以至于从计算模拟到数据处理到数据绘图,从小实用工具到大型游戏(如EVE Online),无不可以用python做到。因为我主要是做计算模拟,数据处理和绘图,所以用的库主要是numpy(numerical python,做计算模拟和数据处理的基本包,也有基本的傅立叶变换,矩阵分解的功能),scipy(除了多维度傅立叶变换,更复杂的矩阵处理,还有解ODE初值问题的工具,很多种数据拟合的工具),matplotlib(比较成熟的数据绘图工具,链接是官网上的示例,每种不同的图都有对应的代码,学起来非常简便快捷)。基本上大多数比较成熟的数据处理都有相应的程序包完成,不需要自己写处理的代码。事实上在有现成程序包可以完成的情况下,我们不推荐自己写用来实现功能的代码。因为python的执行效率只有C的40~50%,而python的程序库事实上是用C和fortran写的。ipython只是一个IDE,本身没有特别的功能,但是它会让使用python更加便捷,尤其是ipython notebook,可以让你灵活地结合脚本和interactive shell的优势处理你需要处理的问题。
    gnuplot:本身几乎没有的数据处理的功能,gnuplot是一个专门用来数据绘图的工具。它的命令语法简洁实用。基本上可以说是可视化数据最优秀的工具了。
    R:专业的数据处理软件,可以进行各种统计学处理,矩阵分析,傅立叶变换等操作,也拥有相当简洁的数据可视化功能。
    Octave:如果你以前常用matlab,但目前使用的计算机又没有被授权使用这个软件,除了盗版以外,其实还有一个途径延续自己的使用习惯,那就是Octave。Octave基本上就是matlab的开源版,语法完全相同,matlab的程序在octave上使用没有任何问题,而且据说octave下程序运行效率也不低于matlab,所以可以说它是一个很好可以用来的替代昂贵的matlab的软件。


文档处理/排版工具:

    latex:也是曾经写了很长一篇介绍的软件,最好的文档排版工具,没有之一。 
    lyx:一个latex的wrapper。用户界面(图形化的)非常友好,所见即所得,因此很多对latex语法望而生畏的人会使用它。缺点是写出来的文档,实际保存的tex文件非常冗长。也就是说用lyx写出来的文档基本上也就只能再用lyx修改,如果有些操作没法用lyx做而需要手动修改tex文件的话,you are in trouble. 


音频、视频处理/解码工具:

    Audacity:一个非常优秀的音频处理工具。虽然可能比不上一些比如AA(Aobe Audition)这样专业的音频处理软件,但可以比较方便地完成音频降噪,剪裁,拼接,变形和混响等处理。
    xld:全称是X Lossless Decoder。是OS X下的无损音乐解码,播放和转码工具。它可以方便地将flac,alac,wav,aiff等格式的音乐来回转码,如果你有光驱还可以用它直接将CD抓取成你所要的无损格式。
    vlc:视频播放工具,支持几乎所有视频格式。对中文字幕支持可能有点薄弱,主要是因为中文的编码方式比较不标准,linux,windows和mac所用的默认编码都不一样,比较难折腾。
    mplayer/mplayerx:与vlc相似,mplayer是一个支持多种格式,可以在各种平台(linux,unix,windows,os X)上使用的播放器。mPlayerX是mPlayer在os X平台上的一个wrapper,有非常轻便,无干扰的界面,可以让你全心地投入到当前播放的电影或其他视频中。


匿名网络:

    Tor:匿名上网软件,使用加密的分布式数据传输来实现用户的匿名上网。由于每次数据传输通道都是在大量的node里随机选择的,这个软件可以让用户的数据很难被监控,更难被跟踪。出于显而易见的原因,这个软件在某个国家是被封锁的。

    Tox:基于和Tor相似的原理,实现无法被监控的点对点网上聊天。这个软件还在早期开发阶段,貌似还没有被某国政府封锁。目前这个软件有在windows,linux和mac下使用的版本,拥有文本聊天,语音和视频聊天与文件传输功能。