diff --git a/README.md b/README.md index f82354ba62..eeec14aee8 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ 简介 ------------------------------- -[LCTT](https://linux.cn/lctt/) 是“Linux中国”([https://linux.cn/](https://linux.cn/))的翻译组,负责从国外优秀媒体翻译 Linux 相关的技术、资讯、杂文等内容。 +[LCTT](https://linux.cn/lctt/) 是“Linux 中国”([https://linux.cn/](https://linux.cn/))的翻译组,负责从国外优秀媒体翻译 Linux 相关的技术、资讯、杂文等内容。 LCTT 已经拥有几百名活跃成员,并欢迎更多的 Linux 志愿者加入我们的团队。 @@ -31,14 +31,14 @@ LCTT 的组成 加入我们 ------------------------------- -请首先加入翻译组的 QQ 群,群号是:198889102,加群时请说明是“志愿者”。加入后记得修改您的群名片为您的 GitHub 的 ID。 +请首先加入翻译组的 QQ 群,群号是:**198889102**,加群时请说明是“*志愿者*”。加入后记得修改您的群名片为您的 GitHub 的 ID。 加入的成员,请先阅读 [WIKI 如何开始](https://github.com/LCTT/TranslateProject/wiki/01-如何开始)。 如何开始 ------------------------------- -请阅读 [WIKI](https://github.com/LCTT/TranslateProject/wiki)。 +请阅读 [WIKI](https://github.com/LCTT/TranslateProject/wiki)。如需要协助,请在群内发问。 历史 ------------------------------- @@ -79,44 +79,52 @@ LCTT 的组成 * 2018/08/17 提升 pityonline 为核心成员,担任校对,并接受他的建议采用 PR 审核模式。 * 2018/09/10 [LCTT 五周年](https://linux.cn/article-9999-1.html)。 * 2018/10/25 重构了 CI,感谢 vizv、lujun9972、bestony。 +* 2018/11/13 [成立了项目管理委员会(PMC)](https://linux.cn/article-10279-1.html),初始成员为:@wxy (主席)、@oska874、@lujun9972、@bestony、@pityonline、@geekpi、@qhwdw。 -核心成员 + +项目管理委员及核心成员 ------------------------------- -目前 LCTT 核心成员有: +LCTT 现由项目管理委员会(PMC)进行管理,成员如下: -- 组长 @wxy, -- 选题 @oska874, -- 选题 @lujun9972, -- 技术 @bestony, -- 校对 @jasminepeng, -- 校对 @pityonline, -- 钻石译者 @geekpi, -- 钻石译者 @qhwdw, -- 钻石译者 @GOLinux, -- 核心成员 @GHLandy, -- 核心成员 @martin2011qi, -- 核心成员 @ictlyh, -- 核心成员 @strugglingyouth, -- 核心成员 @FSSlc, -- 核心成员 @zpl1025, -- 核心成员 @runningwater, -- 核心成员 @bazz2, -- 核心成员 @Vic020, -- 核心成员 @alim0x, -- 核心成员 @tinyeyeser, -- 核心成员 @Locez, -- 核心成员 @ucasFL, -- 核心成员 @rusking, +- 组长 @wxy (主席) +- 选题 @oska874 +- 选题 @lujun9972 +- 技术 @bestony +- 校对 @pityonline +- 译者 @geekpi +- 译者 @qhwdw + +目前 LCTT 核心成员有: + +- 核心成员 @vizv +- 核心成员 @zpl1025 +- 核心成员 @runningwater +- 核心成员 @FSSlc +- 核心成员 @Vic020 +- 核心成员 @alim0x +- 核心成员 @martin2011qi +- 核心成员 @Locez +- 核心成员 @ucasFL - 核心成员 @MjSeven -- 前任选题 @DeadFire, -- 前任校对 @reinoir222, -- 前任校对 @PurlingNayuki, -- 前任校对 @carolinewuyan, -- 功勋成员 @vito-L, -- 功勋成员 @willqian, -- 功勋成员 @vizv, -- 功勋成员 @dongfengweixiao, + +曾经做出了巨大贡献的核心成员,被列入荣誉榜: + +- 前任选题 @DeadFire +- 前任校对 @reinoir222 +- 前任校对 @PurlingNayuki +- 前任校对 @carolinewuyan +- 功勋成员 @tinyeyeser +- 功勋成员 @vito-L +- 功勋成员 @willqian +- 功勋成员 @GOLinux +- 功勋成员 @bazz2 +- 功勋成员 @ictlyh +- 功勋成员 @jasminepeng +- 功勋成员 @dongfengweixiao +- 功勋成员 @strugglingyouth +- 功勋成员 @GHLandy +- 功勋成员 @rusking 全部成员列表请参见: https://linux.cn/lctt-list/ 。 diff --git a/published/20180707 Version Control Before Git with CVS.md b/published/20180707 Version Control Before Git with CVS.md new file mode 100644 index 0000000000..32271b564f --- /dev/null +++ b/published/20180707 Version Control Before Git with CVS.md @@ -0,0 +1,324 @@ +Git 前时代:使用 CVS 进行版本控制 +====== + +GitHub 网站发布于 2008 年。如果你的软件工程师职业生涯跟我一样,也是晚于此时间的话,Git 可能是你用过的唯一版本控制软件。虽然其陡峭的学习曲线和不直观地用户界面时常会遭人抱怨,但不可否认的是,Git 已经成为学习版本控制的每个人的选择。Stack Overflow 2015 年进行的开发者调查显示,69.3% 的被调查者在使用 Git,几乎是排名第二的 Subversion 版本控制系统使用者数量的两倍。[^1] 2015 年之后,也许是因为 Git 太受欢迎了,大家对此话题不再感兴趣,所以 Stack Overflow 停止了关于开发人员使用的版本控制系统的问卷调查。 + +GitHub 的发布时间距离 Git 自身发布时间很近。2005 年,Linus Torvalds 发布了 Git 的首个版本。现在的年经一代开发者可能很难想象“版本控制软件”一词所代表的世界并不仅仅只有 Git,虽然这样的世界诞生的时间并不长。除了 Git 外,还有很多可供选择。那时,开源开发者较喜欢 Subversion,企业和视频游戏公司使用 Perforce (到如今有些仍在用),而 Linux 内核项目依赖于名为 BitKeeper 的版本控制系统。 + +其中一些系统,特别是 BitKeeper,会让年经一代的 Git 用户感觉很熟悉,上手也很快,但大多数相差很大。除了 BitKeeper,Git 之前的版本控制系统都是以不同的架构模型为基础运行的。《[Version Control By Example][8]》一书的作者 Eric Sink 在他的书中对版本控制进行了分类,按其说法,Git 属于第三代版本控制系统,而大多数 Git 的前身,即流行于二十世纪九零年代和二十一世纪早期的系统,都属于第二代版本控制系统。[^2] 第三代版本控制系统是分布式的,第二代是集中式。你们以前大概都听过 Git 被描述为一款“分布式”版本控制系统。我一直都不明白分布式/集中式之间的区别,随后自己亲自安装了一款第二代的集中式版本控件系统,并做了相关实验,至少明白了一些。 + +我安装的版本系统是 CVS。CVS,即 “并发版本系统Concurrent Versions System” 的缩写,是最初的第二代版本控制系统。大约十年间,它是最为流行的版本控制系统,直到 2000 年被 Subversion 所取代。即便如此,Subversion 被认为是 “更好的 CVS”,这更进一步突出了 CVS 在二十世纪九零年代的主导地位。 + +CVS 最早是由一位名叫 Dick Grune 的荷兰科学家在 1986 年开发的,当时有一个编译器项目,他正在寻找一种能与其学生合作的方法。[^3] CVS 最初仅仅只是一个包装了 RCS(修订控制系统Revision Control System) 的 Shell 脚本集合,Grune 想改进这个第一代的版本控制系统。 RCS 是按悲观锁模式工作的,这意味着两个程序员不可以同时处理同一个文件。需要编辑一个文件话,首先得向 RCS 系统请求一个排它锁,锁定此文件直到完成编辑,如果你想编辑的文件有人正在编辑,你就必须等待。CVS 在 RCS 基础上改进,并把悲观锁模型替换成乐观锁模型,迎来了第二代版本控制系统的时代。现在,程序员可以同时编辑同一个文件、合并编辑部分,随后解决合并冲突问题。(后来接管 CVS 项目的工程师 Brian Berliner 于 1990 年撰写了一篇非常易读的关于 CVS 创新的 [论文][1]。) + +从这个意义上来讲,CVS 与 Git 并无差异,因为 Git 也是运行于乐观锁模式的,但也仅仅只有此点相似。实际上,Linus Torvalds 开发 Git 时,他的一个指导原则是 WWCVSND,即 “CVS 不能做的What Would CVS +Not Do”。每当他做决策时,他都会力争选择那些在 CVS 设计里没有使用的功能选项。[^4] 所以即使 CVS 要早于 Git 十多年,但它对 Git 的影响是反面的。 + +我非常喜欢折腾 CVS。我认为要弄明白为什么 Git 的分布式特性是对以前的版本控制系统的极大改善的话,除了折腾 CVS 外,没有更好的办法。因此,我邀请你跟我一起来一段激动人心的旅程,并在接下来的十分钟内了解下这个近十年来无人使用的软件。(可以看看文末“修正”部分) + +### CVS 入门 + +CVS 的安装教程可以在其 [项目主页][2] 上找到。MacOS 系统的话,可以使用 Homebrew 安装。 + +由于 CVS 是集中式的,所以它有客户端和服务端之区分,这种模式 Git 是没有的。两端分别有不同的可执行文件,其区别不太明显。但要开始使用 CVS 的话,即使只在你的本地机器上使用,也必须设置 CVS 的服务后端。 + +CVS 的后端,即所有代码的中央存储区,被叫做存储库 repository。在 Git 中每一个项目都有一个存储库,而 CVS 中一个存储库就包含所有的项目。尽管有办法保证一次只能访问一个项目,但一个中央存储库包含所有东西是改变不了的。 + +要在本地创建存储库的话,请运行 `init` 命令。你可以像如下所示在家目录创建,也可以在你本地的任何地方创建。 + +``` +$ cvs -d ~/sandbox init +``` + +CVS 允许你将选项传递给 `cvs` 命令本身或 `init` 子命令。出现在 `cvs` 命令之后的选项默认是全局的,而出现在子命令之后的是子命令特有选项。上面所示例子中,`-d` 标志是全局选项。在这儿是告诉 CVS 我们想要创建存储库路径在哪里,但一般 `-d` 标志指的是我们想要使用的且已经存在的存储库位置。一直使用 `-d` 标志很单调乏味,所以可以设置 `CVSROOT` 环境变量来代替。 + +因为我们只是在本地操作,所以仅仅使用 `-d` 参考来传递路径就可以,但也可以包含个主机名。 + +此命令在你的家目录创建了一个名叫 `sandbox` 的目录。 如果你列出 `sandbox` 内容,会发现下面包含有名为 `CVSROOT` 的目录。请不要把此目录与我们的环境变量混淆,它保存存储库的管理文件。 + +恭喜! 你刚刚创建了第一个 CVS 存储库。 + +### 检入代码 + +假设你决定留存下自己喜欢的颜色清单。因为你是一个有艺术倾向但很健忘的人,所以你键入颜色列表清单,并保存到一个叫 `favorites.txt` 的文件中: + +``` +blue +orange +green + +definitely not yellow +``` + +我们也假设你把文件保存到一个叫 `colors` 的目录中。现在你想要把喜欢的颜色列表清单置于版本控制之下,因为从现在起的五十年间你会回顾下,随着时间的推移自己的品味怎么变化,这件事很有意思。 + +为此,你必须将你的目录导入为新的 CVS 项目。可以使用 `import` 命令: + +``` +$ cvs -d ~/sandbox import -m "" colors colors initial +N colors/favorites.txt + +No conflicts created by this import +``` + +这里我们再次使用 `-d` 标志来指定存储库的位置,其余的参数是传输给 `import` 子命令的。必须要提供一条消息,但这儿没必要,所以留空。下一个参数 `colors`,指定了存储库中新目录的名字,这儿给的名字跟检入的目录名称一致。最后的两个参数分别指定了 “vendor” 标签和 “release” 标签。我们稍后就会谈论标签。 + +我们刚将 `colors` 项目拉入 CVS 存储库。将代码引入 CVS 有很多种不同的方法,但这是 《[Pragmatic Version Control Using CVS][3]》 一书所推荐方法,这是一本关于 CVS 的程序员实用指导书籍。使用这种方法有点尴尬的就是你得重新检出check out工作项目,即使已经存在有 `colors` 此项目了。不要使用该目录,首先删除它,然后从 CVS 中检出刚才的版本,如下示: + +``` +$ cvs -d ~/sandbox co colors +cvs checkout: Updating colors +U colors/favorites.txt +``` + +这个过程会创建一个新的目录,也叫做 `colors`。此目录里会发现你的源文件 `favorites.txt`,还有一个叫 `CVS` 的目录。这个 `CVS` 目录基本上与每个 Git 存储库的 `.git` 目录等价。 + +### 做出改动 + +准备旅行。 + +和 Git 一样,CVS 也有 `status` 命令: + +``` +$ cvs status +cvs status: Examining . +=================================================================== +File: favorites.txt Status: Up-to-date + + Working revision: 1.1.1.1 2018-07-06 19:27:54 -0400 + Repository revision: 1.1.1.1 /Users/sinclairtarget/sandbox/colors/favorites.txt,v + Commit Identifier: fD7GYxt035GNg8JA + Sticky Tag: (none) + Sticky Date: (none) + Sticky Options: (none) +``` + +到这儿事情开始陌生起来了。CVS 没有提交对象这一概念。如上示,有一个叫 “提交标识符Commit Identifier” 的东西,但这可能是一个较新版本的标识,在 2003 年出版的《Pragmatic Version Control Using CVS》一书中并没有提到 “提交标识符” 这个概念。 (CVS 的最新版本于 2008 年发布的。[^5] ) + +在 Git 中,我们所谈论某文件版本其实是在谈论如 `commit 45de392` 相关的东西,而 CVS 中文件是独立版本化的。文件的第一个版本为 1.1 版本,下一个是 1.2 版本,依此类推。涉及分支时,会在后面添加扩展数字。因此你会看到如上所示的 `1.1.1.1` 的内容,这就是示例的版本号,即使我们没有创建分支,似乎默认的会给加上。 + +一个项目中会有很多的文件和很多次的提交,如果你运行 `cvs log` 命令(等同于 `git log`),会看到每个文件提交历史信息。同一个项目中,有可能一个文件处于 1.2 版本,一个文件处于 1.14 版本。 + +继续,我们对 1.1 版本的 `favorites.txt` 文件做些修改(LCTT 译注:原文此处示例有误): + +``` +blue +orange +green +cyan + +definitely not yellow +``` + +修改完成,就可以运行 `cvs diff` 来看看 CVS 发生了什么: + +``` +$ cvs diff +cvs diff: Diffing . +Index: favorites.txt +=================================================================== +RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,v +retrieving revision 1.1.1.1 +diff -r1.1.1.1 favorites.txt +3a4 +> cyan +``` + +CVS 识别出我们我在文件中添加了一个包含颜色 “cyan” 的新行。(实际上,它说我们已经对 “RCS” 文件进行了更改;你可以看到,CVS 底层使用的还是 RCS。) 此差异指的是当前工作目录中的 `favorites.txt` 副本与存储库中 1.1.1.1 版本的文件之间的差异。 + +为了更新存储库中的版本,我们必须提交更改。Git 中,这个操作要好几个步骤。首先,暂存此修改,使其在索引中出现,然后提交此修改,最后,为了使此修改让其他人可见,我们必须把此提交推送到源存储库中。 + +而 CVS 中,只需要运行 `cvs commit` 命令就搞定一切。CVS 会汇集它所找到的变化,然后把它们放到存储库中: + +``` +$ cvs commit -m "Add cyan to favorites." +cvs commit: Examining . +/Users/sinclairtarget/sandbox/colors/favorites.txt,v <-- favorites.txt +new revision: 1.2; previous revision: 1.1 +``` + +我已经习惯了 Git,所以这种操作会让我感到十分恐惧。因为没有变更暂存区的机制,工作目录下任何你动过的东西都会一股脑给提交到公共存储库中。你有过因为不爽,私下里重写了某个同事不佳的函数实现,但仅仅只是自我宣泄一下并不想让他知道的时候吗?如果不小心提交上去了,就太糟糕了,他会认为你是个混蛋。在推送它们之前,你也不能对提交进行编辑,因为提交就是推送。还是你愿意花费 40 分钟的时间来反复运行 `git rebase -i` 命令,以使得本地提交历史记录跟数学证明一样清晰严谨?很遗憾,CVS 里不支持,结果就是,大家都会看到你没有先写测试用例。 + +不过,到现在我终于理解了为什么那么多人都觉得 Git 没必要搞那么复杂。对那些早已经习惯直接 `cvs commit` 的人来说,进行暂存变更和推送变更操作确实是毫无意义的差事。 + +人们常谈论 Git 是一个 “分布式” 系统,其中分布式与非分布式的主要区别为:在 CVS 中,无法进行本地提交。提交操作就是向中央存储库提交代码,所以没有网络连接,就无法执行操作,你本地的那些只是你的工作目录而已;在 Git 中,会有一个完完全全的本地存储库,所以即使断网了也可以无间断执行提交操作。你还可以编辑那些提交、回退、分支,并选择你所要的东西,没有任何人会知道他们必须知道的之外的东西。 + +因为提交是个大事,所以 CVS 用户很少做提交。提交会包含很多的内容修改,就像如今我们能在一个含有十次提交的拉取请求中看到的一样多。特别是在提交触发了 CI 构建和自动测试程序时如此。 + +现在我们运行 `cvs status`,会看到产生了文件的新版本: + +``` +$ cvs status +cvs status: Examining . +=================================================================== +File: favorites.txt Status: Up-to-date + + Working revision: 1.2 2018-07-06 21:18:59 -0400 + Repository revision: 1.2 /Users/sinclairtarget/sandbox/colors/favorites.txt,v + Commit Identifier: pQx5ooyNk90wW8JA + Sticky Tag: (none) + Sticky Date: (none) + Sticky Options: (none) +``` + +### 合并 + +如上所述,在 CVS 中,你可以同时编辑其他人正在编辑的文件。这是 CVS 对 RCS 的重大改进。当需要将更改的部分重新组合在一起时会发生什么? + +假设你邀请了一些朋友来将他们喜欢的颜色添加到你的列表中。在他们添加的时候,你确定了不再喜欢绿色,然后把它从列表中删除。 + +当你提交更新的时候,会发现 CVS 报出了个问题: + +``` +$ cvs commit -m "Remove green" +cvs commit: Examining . +cvs commit: Up-to-date check failed for `favorites.txt' +cvs [commit aborted]: correct above errors first! +``` + +这看起来像是朋友们首先提交了他们的变化。所以你的 `favorites.txt` 文件版本没有更新到存储库中的最新版本。此时运行 `cvs status` 就可以看到,本地的 `favorites.txt` 文件副本有一些本地变更且是 1.2 版本的,而存储库上的版本号是 1.3,如下示: + +``` +$ cvs status +cvs status: Examining . +=================================================================== +File: favorites.txt Status: Needs Merge + + Working revision: 1.2 2018-07-07 10:42:43 -0400 + Repository revision: 1.3 /Users/sinclairtarget/sandbox/colors/favorites.txt,v + Commit Identifier: 2oZ6n0G13bDaldJA + Sticky Tag: (none) + Sticky Date: (none) + Sticky Options: (none) +``` + +你可以运行 `cvs diff` 来了解 1.2 版本与 1.3 版本的确切差异: + +``` +$ cvs diff -r HEAD favorites.txt +Index: favorites.txt +=================================================================== +RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,v +retrieving revision 1.3 +diff -r1.3 favorites.txt +3d2 +< green +7,10d5 +< +< pink +< hot pink +< bubblegum pink +``` + +看来我们的朋友是真的喜欢粉红色,但好在他们编辑的是此文件的不同部分,所以很容易地合并此修改。跟 `git pull` 类似,只要运行 `cvs update` 命令,CVS 就可以为我们做合并操作,如下示: + +``` +$ cvs update +cvs update: Updating . +RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,v +retrieving revision 1.2 +retrieving revision 1.3 +Merging differences between 1.2 and 1.3 into favorites.txt +M favorites.txt +``` + +此时查看 `favorites.txt` 文件内容的话,你会发现你的朋友对文件所做的更改已经包含进去了,你的修改也在里面。现在你可以自由的提交文件了,如下示: + +``` +$ cvs commit +cvs commit: Examining . +/Users/sinclairtarget/sandbox/colors/favorites.txt,v <-- favorites.txt +new revision: 1.4; previous revision: 1.3 +``` + +最终的结果就跟在 Git 中运行 `git pull --rebase` 一样。你的修改是添加在你朋友的修改之后的,所以没有 “合并提交” 这操作。 + +某些时候,对同一文件的修改可能导致冲突。例如,如果你的朋友把 “green” 修改成 “olive”,同时你完全删除 “green”,就会出现冲突。CVS 早期的时候,正是这种情况导致人们担心 CVS 不安全,而 RCS 的悲观锁机制可以确保此情况永不会发生。但 CVS 提供了一个安全保障机制,可以确保不会自动的覆盖任何人的修改。因此,当运行 `cvs update` 的时候,你必须告诉 CVS 想要保留哪些修改才能继续下一步操作。CVS 会标记文件的所有变更,这跟 Git 检测到合并冲突时所做的方式一样,然后,你必须手工编辑文件,选择需要保留的变更进行合并。 + +这儿需要注意的有趣事情就是在进行提交之前必须修复并合并冲突。这是 CVS 集中式特性的另一个结果。而在 Git 里,在推送本地的提交内容之前,你都不用担心合并冲突问题。 + +### 标记与分支 + +由于 CVS 没有易于寻址的提交对象,因此对变更集合进行分组的唯一方法就是对于特定的工作目录状态打个标记。 + +创建一个标记是很容易的: + +``` +$ cvs tag VERSION_1_0 +cvs tag: Tagging . +T favorites.txt +``` + +稍后,运行 `cvs update` 命令并把标签传输给 `-r` 标志就可以把文件恢复到此状态,如下示: + +``` +$ cvs update -r VERSION_1_0 +cvs update: Updating . +U favorites.txt +``` + +因为你需要一个标记来回退到早期的工作目录状态,所以 CVS 鼓励创建大量的抢先标记。例如,在重大的重构之前,你可以创建一个 `BEFORE_REFACTOR_01` 标记,如果重构出错,就可以使用此标记回退。你如果想生成整个项目的差异文件的话,也可以使用标记。基本上,如今我们惯常使用提交的哈希值完成的事情都必须在 CVS 中提前计划,因为你必须首先有个标签才行。 + +可以在 CVS 中创建分支。分支只是一种特殊的标记,如下示: + +``` +$ cvs rtag -b TRY_EXPERIMENTAL_THING colors +cvs rtag: Tagging colors +``` + +这命令仅仅只是创建了分支(每个人都这样觉得吧),所以还需要使用 `cvs update` 命令来切换分支,如下示: + +``` +$ cvs update -r TRY_EXPERIMENTAL_THING +``` + +上面的命令就会把你的当前工作目录切换到新的分支,但《Pragmatic Version Control Using CVS》一书实际上是建议创建一个新的目录来房子你的新分支。估计,其作者发现在 CVS 里切换目录要比切换分支来得更简单吧。 + +此书也建议不要从现有分支创建分支,而只在主线分支(Git 中被叫做 `master`)上创建分支。一般来说,分支在 CVS 中主认为是 “高级” 技能。而在 Git 中,你几乎可以任性创建新分支,但 CVS 中要在真正需要的时候才能创建,比如发布项目。 + +稍后可以使用 `cvs update` 和 `-j` 标志将分支合并回主线: + +``` +$ cvs update -j TRY_EXPERIMENTAL_THING +``` + +### 感谢历史上的贡献者 + +2007 年,Linus Torvalds 在 Google 进行了一场关于 Git 的 [演讲][4](LCTT 译注:[已搬运][9])。当时 Git 是很新的东西,整场演讲基本上都是在说服满屋子都持有怀疑态度的程序员们:尽管 Git 是如此的与众不同,也应该使用 Git。如果没有看过这个视频的话,我强烈建议你去看看。Linus 是个有趣的演讲者,即使他有些傲慢。他非常出色地解释了为什么分布式的版本控制系统要比集中式的优秀。他的很多评论是直接针对 CVS 的。 + +Git 是一个 [相当复杂的工具][5]。学习起来是一个令人沮丧的经历,但也不断的给我惊喜:Git 还能做这样的事情。相比之下,CVS 简单明了,但是,许多我们认为理所当然的操作都做不了。想要对 Git 的强大功能和灵活性有全新的认识的话,就回过头来用用 CVS 吧,这是种很好的学习方式。这很好的诠释了为什么理解软件的开发历史可以让人受益匪浅。重拾过期淘汰的工具可以让我们理解今天所使用的工具后面所隐藏的哲理。 + +如果你喜欢此博文的话,每两周会有一次更新!请在 Twitter 上关注 [@TwoBitHistory][6] 或都通过 [RSS feed][7] 订阅,新博文出来会有通知。 + +### 修正 + +有人告诉我,有很多组织企业,特别是像做医疗设备软件等这种规避风险类的企业,仍在使用 CVS。这些企业中的程序员通过使用一些小技巧来解决 CVS 的限制,例如为几乎每个更改创建一个新分支以避免直接提交给 `HEAD`。 (感谢 Michael Kohne 指出这一点。) + +[^1]: “2015 Developer Survey,” Stack Overflow, accessed July 7, 2018, https://insights.stackoverflow.com/survey/2015#tech-sourcecontrol. +[^2]: Eric Sink, “A History of Version Control,” Version Control By Example, 2011, accessed July 7, 2018, https://ericsink.com/vcbe/html/history_of_version_control.html. +[^3]: Dick Grune, “Concurrent Versions System CVS,” dickgrune.com, accessed July 7, 2018, https://dickgrune.com/Programs/CVS.orig/#History. +[^4]: “Tech Talk: Linus Torvalds on Git,” YouTube, May 14, 2007, accessed July 7, 2018, https://www.youtube.com/watch?v=4XpnKHJAok8. +[^5]: “Concurrent Versions System - News,” Savannah, accessed July 7, 2018, http://savannah.nongnu.org/news/?group=cvs. + +-------------------------------------------------------------------------------- + +via: https://twobithistory.org/2018/07/07/cvs.html + +作者:[Two-Bit History][a] +选题:[lujun9972][b] +译者:[runningwater](https://github.com/runningwater) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://twobithistory.org +[b]: https://github.com/lujun9972 +[1]: https://docs.freebsd.org/44doc/psd/28.cvs/paper.pdf +[2]: https://www.nongnu.org/cvs/ +[3]: http://shop.oreilly.com/product/9780974514000.do +[4]: https://www.youtube.com/watch?v=4XpnKHJAok8 +[5]: https://xkcd.com/1597/ +[6]: https://twitter.com/TwoBitHistory +[7]: https://twobithistory.org/feed.xml +[8]: https://ericsink.com/vcbe/index.html +[9]: https://v.qq.com/x/page/o0772kqh5iv.html diff --git a/sources/tech/20180130 Graphics and music tools for game development.md b/sources/tech/20180130 Graphics and music tools for game development.md index 7414e89704..db2cd04f3b 100644 --- a/sources/tech/20180130 Graphics and music tools for game development.md +++ b/sources/tech/20180130 Graphics and music tools for game development.md @@ -1,3 +1,4 @@ +robsean translating Graphics and music tools for game development ====== diff --git a/sources/tech/20180420 How To Remove Password From A PDF File in Linux.md b/sources/tech/20180420 How To Remove Password From A PDF File in Linux.md deleted file mode 100644 index 09ac06d6b0..0000000000 --- a/sources/tech/20180420 How To Remove Password From A PDF File in Linux.md +++ /dev/null @@ -1,221 +0,0 @@ -robsean translating -How To Remove Password From A PDF File in Linux -====== - -![](https://www.ostechnix.com/wp-content/uploads/2018/04/Remove-Password-From-A-PDF-File-720x340.png) -Today I happen to share a password protected PDF file to one of my friend. I knew the password of that PDF file, but I didn’t want to disclose it. Instead, I just wanted to remove the password and send the file to him. I started to looking for some easy ways to remove the password protection from the pdf files on Internet. After a quick google search, I came up with four methods to remove password from a PDF file in Linux. The funny thing is I had already done it few years ago and I almost forgot it. If you’re wondering how to remove password from a PDF file in Linux, read on! It is not that difficult. - -### Remove Password From A PDF File in Linux - -**Method 1 – Using Qpdf** - -The **Qpdf** is a PDF transformation software which is used to encrypt and decrypt PDF files, convert PDF files to another equivalent pdf files. Qpdf is available in the default repositories of most Linux distributions, so you can install it using the default package manager. - -For example, Qpdf can be installed on Arch Linux and its variants using [**pacman**][1] as shown below. -``` -$ sudo pacman -S qpdf - -``` - -On Debian, Ubuntu, Linux Mint: -``` -$ sudo apt-get install qpdf - -``` - -Now let us remove the password from a pdf file using qpdf. - -I have a password-protected PDF file named **“secure.pdf”**. Whenever I open this file, it prompts me to enter the password to display its contents. - -![][3] - -I know the password of the above pdf file. However, I don’t want to share the password with anyone. So what I am going to do is to simply remove the password of the PDF file using Qpdf utility with following command. -``` -$ qpdf --password='123456' --decrypt secure.pdf output.pdf - -``` - -Quite easy, isn’t it? Yes, it is! Here, **123456** is the password of the **secure.pdf** file. Replace the password with your own. - -**Method 2 – Using Pdftk** - -**Pdftk** is yet another great software for manipulating pdf documents. Pdftk can do almost all sort of pdf operations, such as; - - * Encrypt and decrypt pdf files. - * Merge PDF documents. - * Collate PDF page Scans. - * Split PDF pages. - * Rotate PDF files or pages. - * Fill PDF forms with X/FDF data and/or flatten forms. - * Generate FDF data stencils from PDF forms. - * Apply a background watermark or a foreground stamp. - * Report PDF metrics, bookmarks and metadata. - * Add/update PDF bookmarks or metadata. - * Attach files to PDF pages or the PDF document. - * Unpack PDF attachments. - * Burst a PDF file into single pages. - * Compress and decompress page streams. - * Repair corrupted PDF file. - - - -Pddftk is available in AUR, so you can install it using any AUR helper programs on Arch Linux its derivatives. - -Using [**Pacaur**][4]: -``` -$ pacaur -S pdftk - -``` - -Using [**Packer**][5]: -``` -$ packer -S pdftk - -``` - -Using [**Trizen**][6]: -``` -$ trizen -S pdftk - -``` - -Using [**Yay**][7]: -``` -$ yay -S pdftk - -``` - -Using [**Yaourt**][8]: -``` -$ yaourt -S pdftk - -``` - -On Debian, Ubuntu, Linux Mint, run: -``` -$ sudo apt-get instal pdftk - -``` - -On CentOS, Fedora, Red Hat: - -First, Install EPEL repository: -``` -$ sudo yum install epel-release - -``` - -Or -``` -$ sudo dnf install epel-release - -``` - -Then install PDFtk application using command: -``` -$ sudo yum install pdftk - -``` - -Or -``` -$ sudo dnf install pdftk - -``` - -Once pdftk installed, you can remove the password from a pdf document using command: -``` -$ pdftk secure.pdf input_pw 123456 output output.pdf - -``` - -Replace ‘123456’ with your correct password. This command decrypts the “secure.pdf” file and create an equivalent non-password protected file named “output.pdf”. - -**Also read:** - -**Method 3 – Using Poppler** - -**Poppler** is a PDF rendering library based on the xpdf-3.0 code base. It contains the following set of command line utilities for manipulating PDF documents. - - * **pdfdetach** – lists or extracts embedded files. - * **pdffonts** – font analyzer. - * **pdfimages** – image extractor. - * **pdfinfo** – document information. - * **pdfseparate** – page extraction tool. - * **pdfsig** – verifies digital signatures. - * **pdftocairo** – PDF to PNG/JPEG/PDF/PS/EPS/SVG converter using Cairo. - * **pdftohtml** – PDF to HTML converter. - * **pdftoppm** – PDF to PPM/PNG/JPEG image converter. - * **pdftops** – PDF to PostScript (PS) converter. - * **pdftotext** – text extraction. - * **pdfunite** – document merging tool. - - - -For the purpose of this guide, we only use the “pdftops” utility. - -To install Poppler on Arch Linux based distributions, run: -``` -$ sudo pacman -S poppler - -``` - -On Debian, Ubuntu, Linux Mint: -``` -$ sudo apt-get install poppler-utils - -``` - -On RHEL, CentOS, Fedora: -``` -$ sudo yum install poppler-utils - -``` - -Once Poppler installed, run the following command to decrypt the password protected pdf file and create a new equivalent file named output.pdf. -``` -$ pdftops -upw 123456 secure.pdf output.pdf - -``` - -Again, replace ‘123456’ with your pdf password. - -As you might noticed in all above methods, we just converted the password protected pdf file named “secure.pdf” to another equivalent pdf file named “output.pdf”. Technically speaking, we really didn’t remove the password from the source file, instead we decrypted it and saved it as another equivalent pdf file without password protection. - -**Method 4 – Print to a file -** - -This is the easiest method in all of the above methods. You can use your existing PDF viewer such as Atril document viewer, Evince etc., and print the password protected pdf file to another file. - -Open the password protected file in your PDF viewer application. Go to **File - > Print**. And save the pdf file in any location of your choice. - -![][9] - -And, that’s all. Hope this was useful. Do you know/use any other methods to remove the password protection from PDF files? Let us know in the comment section below. - -More good stuffs to come. Stay tuned! - -Cheers! - - - --------------------------------------------------------------------------------- - -via: https://www.ostechnix.com/how-to-remove-password-from-a-pdf-file-in-linux/ - -作者:[SK][a] -选题:[lujun9972](https://github.com/lujun9972) -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.ostechnix.com/author/sk/ -[1]:https://www.ostechnix.com/getting-started-pacman/ -[2]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 -[3]:http://www.ostechnix.com/wp-content/uploads/2018/04/Remove-Password-From-A-PDF-File-1.png -[4]:https://www.ostechnix.com/install-pacaur-arch-linux/ -[5]:https://www.ostechnix.com/install-packer-arch-linux-2/ -[6]:https://www.ostechnix.com/trizen-lightweight-aur-package-manager-arch-based-systems/ -[7]:https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ -[8]:https://www.ostechnix.com/install-yaourt-arch-linux/ diff --git a/sources/tech/20180422 Command Line Tricks For Data Scientists - kade killary.md b/sources/tech/20180422 Command Line Tricks For Data Scientists - kade killary.md index aea3b6b035..2e1abf248f 100644 --- a/sources/tech/20180422 Command Line Tricks For Data Scientists - kade killary.md +++ b/sources/tech/20180422 Command Line Tricks For Data Scientists - kade killary.md @@ -1,4 +1,4 @@ -Command Line Tricks For Data Scientists • kade killary +GraveAccent翻译中 Command Line Tricks For Data Scientists • kade killary ====== ![](https://i.imgur.com/0mzQMcB.png) diff --git a/sources/tech/20181129 4 open source Markdown editors.md b/sources/tech/20181129 4 open source Markdown editors.md deleted file mode 100644 index 3b92bdb0da..0000000000 --- a/sources/tech/20181129 4 open source Markdown editors.md +++ /dev/null @@ -1,94 +0,0 @@ -lxfminions translating -[#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: subject: (4 open source Markdown editors) -[#]: via: (https://opensource.com/article/18/11/markdown-editors) -[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) -[#]: url: ( ) - -4 open source Markdown editors -====== -If you're looking for an easy way to format Markdown text, these editors may fit your needs. -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-docdish-typewriterkeys.png?itok=IeQWevaV) - -I do most of my writing in a text editor and format it with [Markdown][1]—articles, essays, blog posts, and much more. I'm not the only one, either. Not only do countless people write with Markdown, but there are also more than a few publishing tools built around it. - -Who'd have thought that a simple way to format web documents created by John Gruber and the late Aaron Schwartz would become so popular? - -While most of my writing takes place in a text editor, I can understand the appeal of a dedicated Markdown editor. You get quick access to formatting, you can easily convert your documents to other formats, and you can get an instant preview. - -If you're thinking about going Markdown and are looking for a dedicated editor, here are four open source options for your writing pleasure. - -### Ghostwriter - -[Ghostwriter][2] ranks in the top three of the dedicated Markdown editors I've used or tried. And I've used or tried a few! - -![](https://opensource.com/sites/default/files/uploads/markdown-editors_ghostwriter.png) - -As an editor, Ghostwriter is pretty much a blank canvas. Start typing and adding formatting by hand. If you don't want to do that, or are just learning Markdown and don't know what to add, you can select certain formatting from Ghostwriter's Format menu. - -Admittedly, it's just basic formatting—lists, character formatting, and indenting. You'll have to add headings, code, and the like by hand. But the Task List option is interesting. I know a few people who create their to-do lists in Markdown, and this option makes creating and maintaining one much easier. - -What sets Ghostwriter apart from other Markdown editors is its range of export options. You can choose the Markdown processor you want to use, including [Sundown][3], [Pandoc][4], or [Discount][5]. With a couple of clicks, you can convert what you're writing to HTML5, ODT, EPUB, LaTeX, PDF, or a Word document. - -### Abricotine - -If you like your Markdown editors simple, you'll like [Abricotine][6]. But don't let its simplicity fool you; Abricotine packs quite a punch. - -![](https://opensource.com/sites/default/files/uploads/markdown-editors_abricotine.png) - -Like any other editor, you can enter formatting by hand or use the Format or Insert menus. Abricotine also has a menu for inserting a [GitHub Flavored Markdown][7] table. There are 16 pre-packaged table formats, and you can add rows or columns as you need them. If the tables are looking a bit messy, you can pretty them up by pressing Ctrl+Shift+B. - -Abricotine can automatically display images, links, and math. You can turn all that off if you want to. The editor is, however, limited to exporting documents as HTML. - -### Mark Text - -Like Abricotine, [Mark Text][8] is a simple Markdown editor that might surprise you. It has a few features you might not expect and does quite a good job of handling documents formatted with Markdown. - -![](https://opensource.com/sites/default/files/uploads/markdown-editors_marktext.png) - -Mark Text stays out of your way. There are no menus or toolbars. You get to the commands and functions by clicking the stacked menu in the top-left corner of the editor window. It's just you and your words. - -The editor's default mode is a semi-WYSIWYG view, although you can change that to see the formatting code you've added to your writing. As for that formatting, Mark Text supports GitHub Flavored Markdown, so you can add tables and formatted blocks of code with syntax highlighting. In its default view, the editor displays any images in your document. - -While Mark Text lacks Ghostwriter's range of export options, you can save your files as HTML or PDF. The output doesn't look too bad, either. - -### Remarkable - -[Remarkable][9] lies somewhere between Ghostwriter and Abricotine or Mark Text. It has that two-paned interface, but with a slightly more modern look. And it has a few useful features. - -![](https://opensource.com/sites/default/files/uploads/markdown-editors_remarkable.png) - -The first thing you notice about Remarkable is its [Material Design][10]-inspired look and feel. It's not for everyone, and I'll be honest: It took me a little while to get used to it. Once you do, it's easy to use. - -You get quick access to formatting from the toolbar and the menus. You can also change the preview pane's style using one of 11 built-in Cascading Style Sheets or by creating one of your own. - -Remarkable's export options are limited—you can export your work only as HTML or PDF files. You can, however, copy an entire document or a selected portion as HTML, which you can paste into another document or editor. - -Do you have a favorite dedicated Markdown editor? Why not share it by leaving a comment? - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/18/11/markdown-editors - -作者:[Scott Nesbitt][a] -选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://opensource.com/users/scottnesbitt -[b]: https://github.com/lujun9972 -[1]: https://en.wikipedia.org/wiki/Markdown -[2]: https://wereturtle.github.io/ghostwriter/ -[3]: https://github.com/vmg/sundown -[4]: https://pandoc.org -[5]: https://www.pell.portland.or.us/~orc/Code/discount/ -[6]: http://abricotine.brrd.fr/ -[7]: https://guides.github.com/features/mastering-markdown/ -[8]: https://marktext.github.io/website/ -[9]: https://remarkableapp.github.io/ -[10]: https://en.wikipedia.org/wiki/Material_Design diff --git a/sources/tech/20181204 Have a cow at the Linux command line.md b/sources/tech/20181204 Have a cow at the Linux command line.md index e9b119b59b..28b399d0c3 100644 --- a/sources/tech/20181204 Have a cow at the Linux command line.md +++ b/sources/tech/20181204 Have a cow at the Linux command line.md @@ -1,5 +1,5 @@ [#]: collector: (lujun9972) -[#]: translator: ( ) +[#]: translator: (heguangzhi) [#]: reviewer: ( ) [#]: publisher: ( ) [#]: subject: (Have a cow at the Linux command line) diff --git a/translated/tech/20180420 How To Remove Password From A PDF File in Linux.md b/translated/tech/20180420 How To Remove Password From A PDF File in Linux.md new file mode 100644 index 0000000000..ba3da65506 --- /dev/null +++ b/translated/tech/20180420 How To Remove Password From A PDF File in Linux.md @@ -0,0 +1,222 @@ +robsean Translating + +如何在Linux中从一个PDF文件中移除密码 +====== + +![](https://www.ostechnix.com/wp-content/uploads/2018/04/Remove-Password-From-A-PDF-File-720x340.png) +今天,我碰巧分享一个受密码保护的 PDF 文件给我的一个朋友。我知道这个PDF文件的密码,但是我不想透露密码。作为代替,我只想移除密码并发送文件给他。我开始在因特网上查找一些简单的方法来从 pdf 文件中移除密码保护。在快速 google 搜索后,在 Linux 中,我带来四种方法来从一个 PDF 文件中移除密码 。有趣的事是,在几年以前我已经做到它,并且我也忘记它了。如果你疑惑,如何在 Linux 中从一个 PDF 文件移除密码,继续读!它是不难的。 + +### 在Linux中从一个PDF文件中移除密码 + +**方法 1 – 使用 Qpdf** + +**Qpdf** 是一个 PDF 转换软件,它被用于加密和解密 PDF 文件,转换 PDF 文件到其他等效的 pdf 文件。 Qpdf 在大多数 Linux 发行版中的默认存储库中是可用的,所以你可以使用默认的软件包安装它。 + +例如, Qpdf 可以被安装在 Arch Linux 和它的衍生版,使用 [**pacman**][1] ,像下面显示。 +``` +$ sudo pacman -S qpdf + +``` + +在 Debian, Ubuntu, Linux Mint 上: +``` +$ sudo apt-get install qpdf + +``` + +现在,让我们使用 qpdf 从一个 pdf 文件移除密码。 + +我有一个受密码保护的 PDF 文件,名为 **“secure.pdf”**. 每当我打开这个文件时,它提示我输入密码来显示它的内容。 + +![][3] + +我知道上面 pdf 文件的密码。然而,我不想与任何人共享密码。所以,我将要做的事是简单地移除 PDF 文件的密码,使用 Qpdf 功能带有下面的命令。 +``` +$ qpdf --password='123456' --decrypt secure.pdf output.pdf + +``` + +相当简单,不是吗?是的,它是!这里, **123456** 是 **secure.pdf** 文件的密码。用你自己的密码替换。 + +**方法 2 – 使用 Pdftk** + +**Pdftk** 是另一个用于操作 pdf 文件的好软件。 Pdftk 可以做几乎所有分类的 pdf 操作,例如; + + * 加密和解密 pdf 文件。 + * 合并 PDF 文档。 + * 整理 PDF 页扫描。 + * 拆分 PDF 页。 + * 旋转 PDF 文件或页。 + * 用 X/FDF 数据 填充 PDF 表单,和/或摧毁表单。 + * 从 PDF 表单中生成 PDF数据模板。 + * 应用一个背景水印,或一个前景印记。 + * 报告 PDF 度量标准,书签和元数据。 + * 添加/更新 PDF 书签或元数据。 + * 附加文件到 PDF 页,或 PDF 文档。 + * 解包 PDF 附件。 + * 破裂一个 PDF 文件到单页中。 + * 压缩和解压缩页流。 + * 修复破损的 PDF 文件。 + + + +Pddftk 在 AUR 中是可用的,所以你可以在 Arch Linux 和它的衍生版上使用任意 AUR 帮助程序安装它。 + +使用 [**Pacaur**][4]: +``` +$ pacaur -S pdftk + +``` + +使用 [**Packer**][5]: +``` +$ packer -S pdftk + +``` + +使用 [**Trizen**][6]: +``` +$ trizen -S pdftk + +``` + +使用 [**Yay**][7]: +``` +$ yay -S pdftk + +``` + +使用 [**Yaourt**][8]: +``` +$ yaourt -S pdftk + +``` + +在 Debian, Ubuntu, Linux Mint 上,运行: +``` +$ sudo apt-get instal pdftk + +``` + +在 CentOS, Fedora, Red Hat 上: + +首先,安装 EPEL 仓库: +``` +$ sudo yum install epel-release + +``` + +或 +``` +$ sudo dnf install epel-release + +``` + +然后,安装 PDFtk 应用程序,使用命令: +``` +$ sudo yum install pdftk + +``` + +或者 +``` +$ sudo dnf install pdftk + +``` + +一旦 pdftk 安装,你可以从一个 pdf 文档移除密码,使用命令: +``` +$ pdftk secure.pdf input_pw 123456 output output.pdf + +``` + +用你正确的密码替换“123456”。这个命令解密 “secure.pdf” 文件,并创建一个相同的名为 “output.pdf” 的非密码保护的文件。 + +**也读:** + +**方法 3 – 使用 Poppler** + +**Poppler** 是一个基于 xpdf-3.0 代码基础的 PDF 渲染库。它包含下列用于操作 PDF 文档的命令行功能集。 + + * **pdfdetach** – 列出或提取嵌入的文件。 + * **pdffonts** – 字体分析器。 + * **pdfimages** – 图片提取器。 + * **pdfinfo** – 文档信息。 + * **pdfseparate** – 页提取工具。 + * **pdfsig** – 核查数字签名。 + * **pdftocairo** – PDF 到 PNG/JPEG/PDF/PS/EPS/SVG 转换器,使用 Cairo 。 + * **pdftohtml** – PDF 到 HTML 转换器。 + * **pdftoppm** – PDF 到 PPM/PNG/JPEG 图片转换器。 + * **pdftops** – PDF 到 PostScript (PS) 转换器。 + * **pdftotext** – text 提取。 + * **pdfunite** – 文档合并工具。 + + + +因这个指南的目的,我们仅使用 “pdftops” 功能。 + +在基于 Arch Linux 的发行版上,安装 Poppler,运行: +``` +$ sudo pacman -S poppler + +``` + +在 Debian, Ubuntu, Linux Mint 上: +``` +$ sudo apt-get install poppler-utils + +``` + +在 RHEL, CentOS, Fedora 上: +``` +$ sudo yum install poppler-utils + +``` + +一旦 Poppler 安装,运行下列命令来解密密码保护的 pdf 文件,并创建一个新的相同的名为 output.pdf 的文件。 +``` +$ pdftops -upw 123456 secure.pdf output.pdf + +``` + +再一次,用你的 pdf 密码替换 “123456” 。 + +正如你在上面方法中可能注意到,我们仅转换密码保护的名为 “secure.pdf” 的 pdf 文件到另一个相同的名为 “output.pdf” 的 pdf 文件。技术上讲,我们并没有真的重源文件中移除密码,作为代替,我们解密它,并保存它为另一个相同的没有密码保护的 pdf 文件。 + +**方法 4 – 打印到一个文件 +** + +这是在所有上面方法中的最简单的方法。你可以使用你存在的 PDF 查看器,例如 Atril 文档查看器, Evince 等等,并打印密码保护的 pdf 文件到另一个文件。 + +在你的 PDF 查看器应用程序中打开密码保护的文件。转到 **File - > Print** 。并在你选择的一些位置保存 pdf 文件。 + +![][9] + +于是,这是全部。希望这是有用的。你知道/使用一些其它方法来从从 PDF 文件中移除密码保护And吗?在下面的评价区让我们知道。 + +更多好东西来了。敬请期待! + +谢谢! + + + +-------------------------------------------------------------------------------- + +via: https://www.ostechnix.com/how-to-remove-password-from-a-pdf-file-in-linux/ + +作者:[SK][a] +选题:[lujun9972](https://github.com/lujun9972) +译者:[robsean ](https://github.com/robsean) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.ostechnix.com/author/sk/ +[1]:https://www.ostechnix.com/getting-started-pacman/ +[2]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 +[3]:http://www.ostechnix.com/wp-content/uploads/2018/04/Remove-Password-From-A-PDF-File-1.png +[4]:https://www.ostechnix.com/install-pacaur-arch-linux/ +[5]:https://www.ostechnix.com/install-packer-arch-linux-2/ +[6]:https://www.ostechnix.com/trizen-lightweight-aur-package-manager-arch-based-systems/ +[7]:https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/ +[8]:https://www.ostechnix.com/install-yaourt-arch-linux/ diff --git a/translated/tech/20180707 Version Control Before Git with CVS.md b/translated/tech/20180707 Version Control Before Git with CVS.md deleted file mode 100644 index 6532d65e7c..0000000000 --- a/translated/tech/20180707 Version Control Before Git with CVS.md +++ /dev/null @@ -1,316 +0,0 @@ -Git 之前使用 CVS 进行版本控制 -====== -Github 网站于 2008 年发布。如果你的软件工程师职业生涯跟我一样,也是晚于此时间的话,Git 可能是你用过的唯一版本控制软件。虽然其陡峭的学习曲线和不直观地用户界面时常会遭人抱怨,但不可否认的是, Git 已经成为人们学习版本控制的最佳选择。 2015 年,Stack Overflow 进行的开发者调查显示,69.3% 的被调查者在使用 Git,几乎是排名第二的 Subversion 版本控制系统使用者数量的两倍。2015 年之后,也许是因为 Git 太受欢迎了,大家对此话题不再感兴趣,所以 Stack Overflow 停止了关于开发人员使用版本控制系统软件的问卷调查。 - -Github 的发布时间距离 Git 自身发布时间很近。2005 年, Linus Torvalds 发布了 Git 的首个版本。现在的年经一代开发者可能很难想象“版本控制软件”生命周期所代表的世界并不仅仅只有 Git,虽然这样的世界诞生的时间并不长。除了 Git 外,还有很多可供选择。开源开发者较喜欢 Subversion,企业和视频游戏公司使用 Perforce (到如今有些仍在用),而 Linux 内核项目依赖于名为 BitKeeper 的版本控制系统。 - -其中一些系统,特别是 BitKeeper,会让年经一代的 Git 用户感觉很熟悉,上手也很快,但大多数相差很大。除了 BitKeeper,Git 之前的版本控制系统都是以不同的架构模型为基础运行的。作者 Eric Sink 在他的 [Version Control By Example][8] 一书中对版本控制进行了分类,按其说法,Git 属于第三代版本控制系统,而大多数 Git 的前身,即流行于二十世纪九零年代和二十一世纪早期的系统,都属于第二代版本控制系统。第三代版本控制系统是分布式的,第二代是集中式。你们以前大概都听过 Git 被描述为一款“分布式”版本控制系统。我一直都不明白分布式/集中式之间的区别,随后自己亲自安装了一款第二代的集中式版本控件系统,并做了相关实验,至少明白了一些。 - -我安装的版本系统是 CVS。CVS,即 `Concurrent Versions System` 的缩写,是最初的第二代版本控制系统。大约十年,它是最为流行的版本控制系统,直到 2000 年被 Subversion 所取代。即便如此,Subversion 被认为是 “CVS 但做的更好”,这更进一步突出了 CVS 在二十世纪九零年代的主导地位。 - -CVS 最早是由一位名叫 Dick Grune 的荷兰科学家在 1986 年间开发的,当时有一个编译器项目,他正在寻找一种能与其学生合作的方法。CVS 最初仅仅只是一个包装了 RCS(修订控制系统) 的 Shell 脚本集合,Grune 想改进这个第一代的版本控制系统。 RCS 是按悲观锁模式工作的,这意味着两个程序员不可以同时处理同一个文件。需要编辑一个文件话,首先得向 RCS 系统请求一个排它锁,锁定此文件直到完成编辑,如果你想编辑的文件有人正在编辑,你就必须等待。CVS 在 RCS 基础上改进,并把悲观锁模型替换成乐观锁模型,迎来了第二代版本控制系统的时代。现在,程序员可以同时编辑同一个文件、合并编辑部分,随后解决合并冲突问题。(后来接管 CVS 项目的工程师布莱恩·柏林(Brian Berliner)于 1990 年撰写了一篇关于 CVS 创新的非常易读的 [论文][1]。) - -从这个意义上来讲,CVS 与 Git 并无差异,因为 Git 也是运行于乐观锁模式的,但也仅仅只有此点相似。实际上,Linus Torvalds 开发 Git 时,他的一个指导原则是 WWCVSND,即 “What Would CVS -Not Do (CVS 不能做的).” 每当他做决策时,他都会力争选择那些在 CVS 设计里没有使用的功能选项。所以即使 CVS 要早于 Git 十多年,但它对 Git 的影响是为负数的。 - -我非常喜欢折腾 CVS。我认为要弄明白为什么 Git 的分布式特性是对以前的版本控制系统的较大改善的话,除了折腾 CVS 外,没有更好的办法。因此,我邀请您跟我一起来一段激动人心的旅程,并在接下来的十分钟内了解下这个近十年来无人使用的软件。(可以看看修正部分) - -### CVS 入门 - -CVS 的安装教程可以在其 [项目主页][2] 上找到。MacOS 系统的话,可以使用 Homebrew 安装。 - -由于 CVS 是集中式的,所以它有客户端和服务端之区分,这种模式 Git 是没有的。两端分别有不同的可执行文件,其区别不太明显。但要开始使用 CVS 的话,即使只在您的本地机器上使用,也必须设置 CVS 的服务后端。 - -CVS 的后端,即所有代码的中央存储区,被叫做存储库 (repository)。在 Git 中每一个项目都有一个存储库,而 CVS 中一个存储库就包含所有的项目。尽管有办法保证一次只能访问一个项目,但一个中央存储库包含所有东西是改变不了的。 - -要在本地创建存储库的话,请运行 `init` 命令。您可以像如下所示在家(home)目录创建,也可以在您本地的任何地方创建。 - -``` -$ cvs -d ~/sandbox init -``` - -CVS 允许您将选项传递给 `cvs` 命令本身或 `init` 子命令。出现在 `cvs` 命令之后的选项默认是全局的,而出现在子命令之后的是子命令特有选项。上面所示例子中,`-d` 标志是全局选项。在这儿是告诉 CVS 我们想要创建存储库路径在哪里,但通用的 `-d` 标志指的是我们想要使用的且已经存在的存储库位置。一直使用 `-d` 标志很单调乏味,所以可以设置 `CVSROOT` 环境变量来代替。 - -因为我们只是在本地操作,所以仅仅使用 `-d` 参考来传送路径就可以,但也可以包含个主机名。 - -此命令在您的家目录创建了一个名叫 `sandbox` 的目录。 如果您列出 `sandbox` 内容,会发现下面包含有 `CVSROOT` 的目录。请不要把此目录与我们的环境变量混淆,它保存存储库的管理文件。 - -恭喜! 您刚刚创建了第一个 CVS 存储库。 - -### 检入代码 - -假设你决定留存下自己喜欢的颜色清单。因为您是一个有艺术倾向但很健忘的人,所以你键入颜色列表清单,并保存到一个叫 `favorites.txt` 的文件中: - -``` -blue -orange -green - -definitely not yellow -``` - -我们也假设您把文件保存到一个叫 `colors` 的目录中。现在你想要把喜欢的颜色列表清单置于版本控制之下,因为从现在起的五十年间会回顾下,随着时间的推移自己的品味怎么变化,这件事很有意思。 - -为此,您必须将您的目录导入为新的 CVS 项目。可以使用 `import` 命令: - -``` -$ cvs -d ~/sandbox import -m "" colors colors initial -N colors/favorites.txt - -No conflicts created by this import -``` - -这里我们再次使用 `-d` 标志来指定存储库的位置,其余的参数是传输给 `import ` 子命令的。必须要提供一条消息,但这儿没必要,所以留空。下一个参数 `colors`,指定了存储库中新目录的名字,这儿给的名字跟检入的目录名称一致。最后的两个参数分别指定了 vendor 标签和 release 标签。我们稍后就会谈论标签。 - -我们刚将 `colors` 项目拉入 CVS 存储库。将代引入 CVS 有很多种不同的方法,但这是 [Pragmatic Version Control Using CVS][3] 一书所推荐方法,这是一本关于 CVS 的程序员实用指导书籍。使用这种方法有点尴尬的就是你得重新检出 (check out) 工作项目,即使已经存在有 `colors` 此项目了。不要使用该目录,首先删除它,然后从 CVS 中检出刚才的版本,如下示: - -``` -$ cvs -d ~/sandbox co colors -cvs checkout: Updating colors -U colors/favorites.txt -``` - -这个过程会创建一个新的目录,也叫做 `colors`。此目录里会发现您的源文件 `favorites.txt`,还有一个叫 `CVS` 的目录。这个 `CVS` 目录基本上与 Git 存储库的 `.git` 目录等同。 - -### 做出改动 - -准备旅行。 - -和 Git 一样,CVS 也有 `status` 命令: - -``` -$ cvs status -cvs status: Examining . -=================================================================== -File: favorites.txt Status: Up-to-date - - Working revision: 1.1.1.1 2018-07-06 19:27:54 -0400 - Repository revision: 1.1.1.1 /Users/sinclairtarget/sandbox/colors/favorites.txt,v - Commit Identifier: fD7GYxt035GNg8JA - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) -``` - -到这儿事情开始陌生起来了。CVS 没有提交对象这一概念。如上示,有一个叫 “提交标识符 Commit Identifier ” 的东西,但这可能是一个较新版本的标识,在 2003 年出版的《Pragmatic Version Control Using CVS》一书中并没有提到 “提交标识符” 这个概念。 (CVS 的最新版本于 2008 年发布的。) - -在 Git 中,我们所谈论某文件版本其实是在谈论如 `commit 45de392` 相关的东西,而 CVS 中文件是独立版本化的。文件的第一个版本为 1.1 版本,下一个是 1.2 版本,依此类推。涉及分支时,会在后面添加扩展数字。因此您会看到如上所示的 `1.1.1.1` 的内容,这就是示例的版本号,即使我们没有创建分支,似乎默认的会给加上。 - -一个项目中会有很多的文件和很多次的提交,如果您运行 `cvs log` 命令(等同于 `git log`),会看到每个文件提交历史信息。同一个项目中,有可能一个文件处于 1.2 版本,一个文件处于 1.14 版本。 - -继续,我们对 1.1 版本的 `favorites.txt` 文件做些修改: - -``` - blue - orange - green -+cyan - - definitely not yellow -``` - -修改完成,就可以运行 `cvs diff` 来看看 CVS 发生了什么: - -``` -$ cvs diff -cvs diff: Diffing . -Index: favorites.txt -=================================================================== -RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,v -retrieving revision 1.1.1.1 -diff -r1.1.1.1 favorites.txt -3a4 -> cyan -``` - -CVS 识别出我们我在文件中添加了一个包含颜色 "cyan" 的新行。(实际上,它说我们已经对 “RCS” 文件进行了更改;你可以看到,CVS 底层使用的还是 RCS。) 此差异指的是当前工作目录中的 `favorites.txt` 副本与存储库中 1.1.1.1 版本的文件之间的差异。 - -为了更新存储库中的版本,我们必须提交更改。Git 中,这个操作要好几个步骤。首先,暂存此修改,使其在索引中出现,然后提交此修改,最后,为了使此修改让其他人可见,我们必须把此提交推送到源存储库中。 - -而 CVS 中,只需要运行 `cvs commit` 命令就搞定一切。CVS 会查找所有修改的东西,进行捆绑,然后把它们放到存储库中。 - -``` -$ cvs commit -m "Add cyan to favorites." -cvs commit: Examining . -/Users/sinclairtarget/sandbox/colors/favorites.txt,v <-- favorites.txt -new revision: 1.2; previous revision: 1.1 -``` - -我已经习惯了 Git, 所以这种操作会让我感到十分恐惧。因为没有变更暂存区的机制,工作目录下修改的一些老旧的东西都会一股脑给提交到公共存储库中。您有过因为不爽,私下里重写了某个同事不佳的功能实现,但仅仅只是自我宣泄一下并不想让他知道的时候吗?如果不小心提交上去了,就太糟糕了,他会认为你是个混蛋。在推送之前,你也不能修改提交过的东西了,因为提交就是推送。还是您愿意花费 40 分钟的时间来反复运行 `git rebase -i` 命令,以使得本地提交历史记录跟数学证明一样清晰严谨?很遗憾,CVS 里不支持,结果就是,大家都会看到您没有先写测试用例。 - -不过,到现在我终于理解了为什么那么多人都觉得 Git 没必要搞那么复杂。对那些早已经习惯直接 `cvs commit` 的人来说,进行暂存变更和推送变更操作确实是毫无意义的差事。 - -人们常谈论 Git 是一个 “分布式” 系统,其意思中分布式与非分布式的主要区别为:在 CVS 中,无法进行本地提交。一次提交操作就是向中央存储库提交代码,所以没有网络连接,刚无法执行此操作,获取到本地的只是您的工作目录;在 Git 中,会有一个完完全全的本地存储库,所以即使断网了也可以无间断执行提交操作。您还可以进行编辑提交内容、回退、分支和随心所欲的操作,且无人知晓。 - -虽然提交是个很大的话题,但 CVS 用户很少会关注。提交会包含很多的内容修改及今天我们盼望看到的十多次提交请求。还有很特别的,提交触发 CI 构建和触发自动测试程序等。 - -现在我们运行 `cvs status`,会看到产生了文件的新版本: - -``` -$ cvs status -cvs status: Examining . -=================================================================== -File: favorites.txt Status: Up-to-date - - Working revision: 1.2 2018-07-06 21:18:59 -0400 - Repository revision: 1.2 /Users/sinclairtarget/sandbox/colors/favorites.txt,v - Commit Identifier: pQx5ooyNk90wW8JA - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) -``` - -### 合并 - -如上所述,在 CVS 中,你可以同时编辑其他人正在编辑的文件。这是 CVS 对 RCS 的重大改进。当需要将更改的部分重新组合在一起时会发生什么? - -假设您邀请了一些来将他们喜欢的颜色添加到您的列表中。在他们添加的时候,您确定了不再喜欢绿色,然后把它从列表中删除。 - -当你提交更新的时候,会发现 CVS 报出了个问题: - -``` -$ cvs commit -m "Remove green" -cvs commit: Examining . -cvs commit: Up-to-date check failed for `favorites.txt' -cvs [commit aborted]: correct above errors first! -``` - -好像是朋友们首先提交了更新。所以您的 `favorites.txt` 文件版本没有更新到存储库中的最新版本。此时运行 `cvs status` 就可以看到,本地的 `favorites.txt` 文件副本有一些变更且是 1.2 版本的而存储库上的版本号是 1.3,如下示: - -``` -$ cvs status -cvs status: Examining . -=================================================================== -File: favorites.txt Status: Needs Merge - - Working revision: 1.2 2018-07-07 10:42:43 -0400 - Repository revision: 1.3 /Users/sinclairtarget/sandbox/colors/favorites.txt,v - Commit Identifier: 2oZ6n0G13bDaldJA - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) -``` - -你可以运行 `cvs diff` 来了解 1.2 版本与 1.3 版本的确切差异: - -``` -$ cvs diff -r HEAD favorites.txt -Index: favorites.txt -=================================================================== -RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,v -retrieving revision 1.3 -diff -r1.3 favorites.txt -3d2 -< green -7,10d5 -< -< pink -< hot pink -< bubblegum pink -``` - -看来我们的朋友是真的喜欢粉红色,但好在他们编辑的是此文件的不同部分,所以很容易地合并此修改。跟 `git pull` 类似,只要运行 `cvs update` 命令,CVS 就可以为我们做合并操作,如下示: - -``` -$ cvs update -cvs update: Updating . -RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,v -retrieving revision 1.2 -retrieving revision 1.3 -Merging differences between 1.2 and 1.3 into favorites.txt -M favorites.txt -``` - -此时查看 `favorites.txt` 文件内容的话,你会发现你的朋友对文件所做的更改已经包含进去了,你的修改也在里面。现在你可以自由的提交文件了,如下示: - -``` -$ cvs commit -cvs commit: Examining . -/Users/sinclairtarget/sandbox/colors/favorites.txt,v <-- favorites.txt -new revision: 1.4; previous revision: 1.3 -``` - -最终的结果就跟在 Git 中运行 `git pull --rebase` 一样。你的修改是添加在你朋友的修改之后的,所以没有 “合并提交” 这操作。 - -某些时候,对同一文件的修改可能导致冲突。例如,如果你的朋友把 “green” 修改成 “olive”,同时你完全删除 “green”,就会出现冲突。早期的时候,正是这种情况导致人们担心 CVS 不安全,而 RCS 的悲观锁机制可以确保此情况永不会发生。但 CVS 提供了一个安全保障机制,可以确保不会自动的覆盖任何人的修改。因此,当运行 `cvs update` 的时候,你必须告诉 CVS 想要做哪些修改才能继续下一步操作。CVS 会标记文件的所有变更,这跟 Git 检测到合并冲突时所做的方式一样,然后,你必须手工编辑文件,选择需要保留的变更进行合并。 - -这儿需要注意的有趣事情就是在进行提交之前必须修复并合并冲突。这是 CVS 集中式特性的另一个结果。而在 Git 里,在推送本地的提交内容之前,您都不用担心合并冲突问题。 - -由于 CVS 没有易于记录的提交对象,因此对变更集合进行分组的唯一方法就是对于特定的工作目录状态打个标记。 - -创建一个标记是很容易的: - -``` -$ cvs tag VERSION_1_0 -cvs tag: Tagging . -T favorites.txt -``` - -稍后,运行 `cvs update` 命令并把标签传输给 `-r` 标志就可以把文件恢复到此状态,如下示: - -``` -$ cvs update -r VERSION_1_0 -cvs update: Updating . -U favorites.txt -``` - -因为你需要一个标记来回退到早期的工作目录状态,所以 CVS 鼓励创建大量的抢占标记。例如,在重大的重构之前,你可以创建一个 `BEFORE_REFACTOR_01` 标记,如果重构出错,就可以使用此标记回退。你果想在项目范围上生成有差异的版本的话,也可以使用标记。基本上,我们使用 CVS 来管理的, 对于今天日常所做的所有事情都是预测性和计划性的,所以需要打上标记,以备回退修改。 - -可以在 CVS 中创建分支。分支只是一种特殊的标记,如下示: - -``` -$ cvs rtag -b TRY_EXPERIMENTAL_THING colors -cvs rtag: Tagging colors -``` - -(顺便提醒一下读者)这命令仅仅只是创建了分支,所以还需要使用 `cvs update` 命令来切换分支,如下示: - -``` -$ cvs update -r TRY_EXPERIMENTAL_THING -``` - -上面的命令就会把您的当前工作目录切换到新的分支,但《Pragmatic Version Control Using CVS》一书实际上是建议创建一个新的目录来间接替代新分支。估计,其作者发现在 CVS 里切换目录要比切换分支来得更简单吧。 - -此书也建议不要从现有分支创建分支,而只在主线分支,Git 中被叫做 `master`,上创建分支。一般来说,分支在 CVS 中主认为是 “高级” 技能。而在 Git 中,您几乎可以无理由的就创建新分支,但 CVS 中要在真正需要的时候才能创建,比如发布项目。 - -稍后可以使用 `cvs update` 和 `-j` 标志将分支合并回主线: - -``` -$ cvs update -j TRY_EXPERIMENTAL_THING -``` - -### 感谢历史上的贡献者 - -2007 年,Linus Torvalds 在 Google 进行了一场关于 Git 的 [演讲][4](译者注:需要梯子,国内用户可以访问 [腾讯视频][9])。当时 Git 是很新的东西,整场演讲基本上都是在说服满屋子都持有怀疑态度的程序员们,尽管 Git 是如此的与众不同,也应该使用 Git。如果没有看过这个视频的话,我强烈建议你去看看。Linus 是个有趣的演讲者,即使他有些傲慢。他非常出色地解释了为什么分布式的版本控制系统要比集中式的优秀。他的很多评论是直接针对 CVS 的。 - -Git 是一个 [相当复杂的工具][5]。学习起来是一个令人沮丧的经历,但也不断的给我惊喜,Git 还能做这样的事情。相比之下,CVS 简单明了,但是,许多我们认为理所当然的操作都做不了。想要对 Git 的强大功能和灵活性有全新的认识的话,就回过头来用用 CVS 吧,这是种很好的学习方式。这很好的诠释了为什么理解软件的开发历史可以让人受益匪浅。重拾过期淘汰的工具可以让我们理解今天所使用的工具后面所隐藏的哲理。 - -如果您喜欢此博文的话,每两周会有一次更新!请在 Twitter 上关注 [@TwoBitHistory][6] 或都通过 [RSS feed][7] 订阅,新博文出来会有通知。 - -#### 修正 - -有人告诉我,有很多组织企业,特别是像做医疗设备软件等这种规避风险类的企业,仍在使用 CVS。这些企业中的程序员通过使用一些小技巧来解决 CVS 的限制,例如为几乎每个更改创建一个新分支以避免直接提交给 `HEAD`。 (感谢 Michael Kohne 指出这一点。) - - --------------------------------------------------------------------------------- - -via: https://twobithistory.org/2018/07/07/cvs.html - -作者:[Two-Bit History][a] -选题:[lujun9972][b] -译者:[runningwater](https://github.com/runningwater) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://twobithistory.org -[b]: https://github.com/lujun9972 -[1]: https://docs.freebsd.org/44doc/psd/28.cvs/paper.pdf -[2]: https://www.nongnu.org/cvs/ -[3]: http://shop.oreilly.com/product/9780974514000.do -[4]: https://www.youtube.com/watch?v=4XpnKHJAok8 -[5]: https://xkcd.com/1597/ -[6]: https://twitter.com/TwoBitHistory -[7]: https://twobithistory.org/feed.xml -[8]: https://ericsink.com/vcbe/index.html -[9]: https://v.qq.com/x/page/o0772kqh5iv.html diff --git a/translated/tech/20181129 4 open source Markdown editors.md b/translated/tech/20181129 4 open source Markdown editors.md new file mode 100644 index 0000000000..f0ea3bbbf9 --- /dev/null +++ b/translated/tech/20181129 4 open source Markdown editors.md @@ -0,0 +1,94 @@ +[#]: collector: (lujun9972) +[#]: translator: (lxfminions ) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: subject: (4 open source Markdown editors) +[#]: via: (https://opensource.com/article/18/11/markdown-editors) +[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt) +[#]: url: ( ) + +4 个 Markdown 开源编辑器 +====== +如果你正在寻找一种简便的方法去格式化 Markdown 文本,那么这些编辑器可能会满足你的需求。 + +![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-docdish-typewriterkeys.png?itok=IeQWevaV) + + +我在编辑器上使用 [Markdown][1] 写作,包括文章,散文,博客等等。我也不是唯一使用 Markdown 写作的人。不仅仅无数的人在使用 Markdown,而且也产生了许多服务于 Markdown 的工具。 + +谁能想到由 John Gruber 和之后的 Aaron Schwartz 创造的一种格式化网页文档的简便的方法如此的受欢迎呢? + +当我在文本编辑器上进行写作时,才理解了为什么 Markdown 编辑器会如此受欢迎-可以快速格式化,可以轻便的将文档转换为其他的格式,可以实时预览。 + +如果你想用 Markdown 和寻找一个 Markdown 编辑器,那么这里有四个开源编辑器可能会让你写作更加轻松。 + +### Ghostwriter + +在我使用过的或试过的三个 Markdown 编辑器中,[Ghostwriter][2] 是最好用的。我已经使用或试了很多次。 + +![](https://opensource.com/sites/default/files/uploads/markdown-editors_ghostwriter.png) + +作为一个编辑器,Ghostwriter 就像一个画布,你可以手动进行编辑和添加格式。如果你不想这么做或者只想学习 Markdown 或者不知道如何添加,你可以从 Ghostwriter 的格式化菜单中选择你想要的格式。 + +一般的,它只有一个基本的格式化列表,字符格式化和缩进。所以你必须手动的添加标题,代码。而且它有一个有趣的任务列表选项,很多人都在用 Markdown 去创造任务列表,这个功能可以让你更加容易去创造和维护。 + +Ghostwriter 区别于其他的 Markdown 编辑器的是它有更多的导出选项。你可以选择你想使用的 Markdown 编译器,包括 [Sundown][3], [Pandoc][4], or [Discount][5]。只需要双击鼠标,你可以轻松的将你写的内容转换为 HTML5, ODT, EPUB,LaTeX,PDF 或 Word 文档。 + +### Abricotine + +如果喜欢简洁的 Markdown 编辑器,你会爱上[Abricotine][6]。但是不要让它的简单性欺骗了你;Abricotine 包含了很多强大的功能。 + +![](https://opensource.com/sites/default/files/uploads/markdown-editors_abricotine.png) + +与其他的编辑器一样,你可以手动格式化文档或使用它的格式化菜单或插入菜单。Abricotine 有一个插入 [GitHub Flavored Markdown][7] 表的菜单。它预装了 16 个表样式,你可以在你需要的地方添加行或列。如果这个表看起来有点复杂,你可以使用 Ctrl+Shift+B 去使它看起来更整洁优美。 + +Abricotine 可以自动显示图片,连接和数学。当然你也可以关闭这些选项。可惜的是,这个编辑器只能导出为 HTML 格式。 + +### Mark Text + +像 Abricotine 一样,[Mark Text][8] 也是一个简洁的 Markdown 编辑器。它有一些你可能没有预料到但能够很好的处理 Markdown 文档的功能。 + +![](https://opensource.com/sites/default/files/uploads/markdown-editors_marktext.png) + +Mark Text 有点奇怪,它们没有菜单或工具条。你需要点击编辑器左上角的弹出式菜单得到命令和功能。它仅仅让你专注于你的内容。 + +虽然当你添加内容后,可以在预览区实时看到你所写的内容,但它仍然是一个半所见即所得的编辑器。Mark Text 支持 GitHub Flavored Markdown 格式,所以你可以添加表和语法高亮的代码块。在缺省的预览中,编辑器会显示你文档的所有图片。 + +与 Ghostwriter 相比,你只能将你的文档保存为 HTML 或 PDF 格式。这个输出看起来也不是很糟糕。 + +### Remarkable + +[Remarkable][9] 复杂性位于 Ghostwriter 和 Abricotine 或 Mark Text 之间。它有一个带点现代风格的双栏界面。它有一些有用的特点。 + +![](https://opensource.com/sites/default/files/uploads/markdown-editors_remarkable.png) + +你注意到的第一件事是它受到 [Material Design][10] 启发的界面外观。它不是每一个人都能习惯的,老实说:我花费了很多时间去适应它。一旦你适应了,它使用起来很简单。 +你可以在工具条和菜单上快速访问格式化功能。你可以使用内置的 11 种样式或你自己创造的去定制预览框的样式。 + +Remarkable 的导出选项是有限的-你只能导出为 HTML 或 PDF 格式文件。然而你可以复制整个文档或挑选一部分作为 HTML,粘贴到另一个文档或编辑器中。 + +你有最喜爱的 Markdown 编辑器吗?为什么不在评论区分享它呢? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/18/11/markdown-editors + +作者:[Scott Nesbitt][a] +选题:[lujun9972][b] +译者:[lxfminions](https://github.com/lxfminions) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/scottnesbitt +[b]: https://github.com/lujun9972 +[1]: https://en.wikipedia.org/wiki/Markdown +[2]: https://wereturtle.github.io/ghostwriter/ +[3]: https://github.com/vmg/sundown +[4]: https://pandoc.org +[5]: https://www.pell.portland.or.us/~orc/Code/discount/ +[6]: http://abricotine.brrd.fr/ +[7]: https://guides.github.com/features/mastering-markdown/ +[8]: https://marktext.github.io/website/ +[9]: https://remarkableapp.github.io/ +[10]: https://en.wikipedia.org/wiki/Material_Design