GNU 项目(开源社区的由来,背后的哲学)
转自译言网:http://article.yeeyan.org/view/88497/59257/
第一个软件共享社区
当我在1971年开始在麻省理工人工智能实验室工作时, 我成为一个已经存在多年的软件共享社区的一员. 共享软件曾经不仅限于我们这个特定的社区,它的历史与计算机一样长,就如分享烹饪技巧的历史与做饭的历史一样长一样。但我们曾经做得比很多事情更多.
人工智能实验室曾用一个分时计算操作系统叫互斥分时操作系统ITS(the Incompatible Timesharing System), 是当时的实验室黑客们用来写汇编语言给 PDP-10用,那个时代最大的计算机其中一台。作为这个社区的一员,一个人工智能系统的黑客⑴,我的工作是改进这个系统。
我们不把我们的软件叫做 "自由软件", 因为当时这个词还未发明,但当时就是如此。只要有大学或公司的人想移植和使用这些程序,我们很高兴地给他们。如果有人看到陌生和有趣的软件,你会问他要源代码,然后你就可以读它,改写它,或直接使用它的一部分来写个新程序。
⑴ “黑客”这个词被认为是“系统安全破坏者” 是一个被传媒混淆概念的词。我们黑客拒绝接受这个意思,而且坚持使用这个词描绘“那些喜欢编程并享受变得聪明的人”
社区的崩溃
情况在1980年代初发生了戏剧性的改变,当Digital公司不再继续支持PDP-10系列计算机。它在60年代时那种结构,优雅和强大的运算能力在80年代需要更大的寻址空间的需求下不能自然扩展使之难以为继。这意味着所有为ITS系统写的代码变成废物。
人工智能实验室已经解散了。在1981年,副产品公司Symbolics雇用了几乎人工智能实验室的所有黑客,然而这个非主流的社区并不能自已养活自己。(有本书 Hackers,作者是 Steve Levy,描述了这件事,同时让人看到这个社区的崇高荣誉).当人工智能实验室在1982年买了一台新的PDP-10时,它的管理员决定使用Digital公司的收费分时操作系统而不是ITS。
在那个时代最先进的计算机,比如 VAX,或68020,有它们自己的操作系统,但它们全部不是免费的:你获得一份拷贝时甚至要签一份保密协议。
这意味着当你一开始使用计算机时就不能帮助你的邻居。一个互助的社区是不允许的。拥有软件专利的人制定的规则是:“如果你和邻居共享代码,你就是海盗。如果你希望改进任何代码,你就得求他们。“
这种专利软件社会系统--你不允许分享和改变软件的系统--是反社会的,不是道德的,它根本上是个错误,可能对于一些读者来说有些惊讶。但我们对于一个基于把大众分裂开并让他们无助的系统,我们还能怎样形容呢?读者看到这里觉得惊讶可能是源于对专利软件销售这个生意的影响。软件发布者使用了很长的时间和努力让大众认为只有一个方法看待这个问题。
当软件发布者在讲“保护”他们的“权力”或“停止盗版”,他们实际上是在说另一个意思。这些词语的真正意思是一种假定;而大众不加鉴别和思考地接受了。让我们分析一下。
一个假定是,软件公司拥有不可置疑的天然权力拥有他们的软件以及他们的软件用户。(如果这是个天然权力,那么无论这对于大众产生多大的危害,我们也不能怀疑)。有趣的是,美国宪法和法治传统反对这个观点;版权并不是自然权力,但一个人为的政府施加的垄断专利系统限制了用户的拷贝软件的天然权力。
另一个没有明文的假定是,软件的唯一重要的事情是允许你做什么--我们计算机用户不应该关心我们允许拥有怎样的社会。
第三个假定是如果我们没有赋于一个软件公司控制用户和软件的权力,我们就没有可用的软件了(或者说没有软件去做这个那个事情)。这个假定看上去好像有道理,那是在自由软件运动彰显出我们可以有很多好用软件并且没有在上面加上枷锁的时候。
如果我们不接受这些假定,并且用常识和伦理去判断,把用户放在第一位,我们得到一个非常不同的结论。计算机用户应该能够自由地修改程序去符合他们的要求,自由地分享软件,因为帮助其他人是这个社会的基础。
关于基于这个结论的扩展的宣言要找另一个空间放,我给个链接 http://www.gnu.org/philosophy/why-free.html.
一个严酷的道德选择
随着我的社区的消亡,继续以前的美好变得不可能。相反,我面对一个严酷的道德选择。
一个简单的选择是加入专利软件世界,签署保密协议并承诺不去帮助我的黑客朋友。很可能我会开发软件并公布它们使用保密协议,所以也给其他人施加压力去背叛他们的朋友。
我可以用这个方法赚钱,或许能让我为了写程序很开心。但我知道这样做的话在我的事业结束时,我会看到我建立了很多墙去分裂人们,而且我会感到我用了一生的时间让这个世界变得更糟糕。
我已经感受过签署保密协议的结果,当有人拒绝给我和麻省理工人工智能实验室一个打印机的控制程序。(那个程序缺少一些特定的功能令我们使用打印机时感到非常沮丧)。所以我不能告诉自己保密协议是无辜的。当他不共享给我的时候我非常的愤怒;我不能对其他人做这种事情。
另一个选择,直接但不愉快地,离开计算机领域。这样的话我的能力不会被错误地使用,但同样会被浪费掉。我不会因为分裂人们和限制计算机用户而成为罪人,但这事情同样会继续发生。
所以我探索一种方法使程序员可以成为好人。我问自己,有没有一个程序或一些程序我能自己写,然后使软件共享社区再次成为可能?
答案很明确:首先需要一个操作系统。这是一个关键的软件去开始使用一台计算机。有了操作系统,你可以做很多事情;没有的话,你不能使用一台计算机。只有有一个自由软件操作系统,我们就可以再次联合黑客们--以及邀请任何人加入进来。而且任何人都不需要由于阴谋而丧失他们的朋友同时使用计算机。
作为一个操作系统开发者,我刚好有能力做这个工作。所以虽然我不能保证能成功,但我明白我是被选中做这个工作的人。我使这个系统兼容UNIX所以它能够被移植,而且UNIX用户可以轻易地换成使用这个系统。GNU这个名字是根据黑客传统起的,它是一个递归的名字“GNU不是UNIX”。
一个操作系统不仅是一个核心,仅仅能运行其它程序。在1970年代,所有的操作系统都应包括命令解释器,汇编程序,编译器,解释程序,调试器,文本编辑器,邮件服务,以及其它。ITS有它们,Multics有它们,VMS有它们,以及UNIX也有。GNU操作系统也有它们。
后来我听到了以下的警句,Hillel说的⑴:
如果我不为自己着想,谁会为我着想?
如果我只为自己着想,那么我是什么东西?
现在不做,更待何时?
开始建设GNU项目基于一个简单的精神。
⑴作为一个无神论者,我不尊崇任何宗教领袖,但有时我会钦佩他们所说的话。
FREE是自由的意思
这个词组“free software"有时被误解了--它与价格毫无关系。它与自由有关。在这里,我们定义自由软件:一个程序是自由软件,对于你,一个特定的用户,如果:
- 你能够自由地运行这个程序,为了任何目的。
- 你能够自由地修改这个程序以符合你的需求。(为了使这一条件能够实现,你必须能够得到它的源代码,如果没有源代码要更改它是极端困难的)。
- 你能自由地发布它的拷贝,无论是免费的还是收费的。
- 你能自由地发布它的修改过的版本,所以社区能够因为你的改进受益.
因为"free"是关于自由的,而不是价格,免费软件和出卖拷贝并不矛盾。事实上,自由地销售拷贝非常重要:使用CD-ROM贩卖自由软件集合对于社区很重要,而且销售它们是一个重要的为了开发软件而获得经费的渠道。所以,如果一个软件不能被自由地包含在这些软件集合中就不是自由软件。
由于"free"这个单词的歧意,人们长时间以来在寻找一个更好的词来取代它,但没人能够找到一个合适的替代词。英语比其它的语言有更多的词汇以及更多的微妙之处,但它缺乏一个明确的单词来表述“自由”,比如说"unfettered"(释放)是最接近的。相似的词汇如“liberated","freedom",以及"open"都有不准确的意思或其它缺点。
GNU软件和GNU系统
开发整个系统是个巨大的工程。为了实现它,我决定把已经存在的自由软件的碎片尽可能移植过来。例如,我决定使用Tex作为原则上的文字格式化标准;一些年之后,我决定使用Xwindow系统而不是重新写一个视窗系统给GNU。
由于这些决定,GNU系统与所有的GNU集合系统都不一样。GNU系统包括非GNU软件,一些其他人为了他们自己的目的开发的软件,但我们可以使用因为它们是自由软件。
开始着手这个项目
在1984年1月,我辞掉了在麻省理工的工作开始写GNU软件。离开MIT是必需的所以MIT不能干预GNU作为一个自由软件发行。如果我不辞职,MIT就会说他们拥有我的工作成果,以及附加他们自己的使用条款,甚至把它们变成专利保护软件包。我可不打算白白浪费我的大量精力,看着我的最大目的失败:创造一个新的共享软件社区。
不管怎样,Winston教授,然后MIT人工智能实验室,很友善地邀请我继续使用实验室的设施。
第一步
在开始GNU项目的前不久,我听说过一个自由的大学编译程序工具包,叫做VUCK。(荷兰语中的“自由”是以V开头)。这个编译器是为了能够多种语言,包括C语言和Pascal,以及能够在不同的机器上运行。我写信询问作者这个软件能否给GNU使用。
他马上嘲笑地回信,说大学是自由的但这编译器不是。所以我决定我的第一个给GNU项目的程序是一个支持多语言,多平台的编译器。
我希望避免整个编译器都由我一个人写,我得到了Pastel编译器的源代码,是一个多平台的编译器由Lawrence Livermore实验室开发。它支持,并被写成一个扩展版本支持Pascal,被设计成一个系统程序语言。我加了C语言的前段,然后开始移植到 Motorola 68000计算机。但我很快就放弃了,因为这编译器需要几兆字节的堆栈空间,但68000UNIX系统只有64K。
后来我明白了Pastel编译器的功能是把整个文件放进语法树,把语法树放进一个"说明性的“链中,然后生成整个输出文件,而且没有翻译任何空间。我得出一个结论就是必须从头写一个编译器。这个编译器就是现在的GCC;没有任何的Pastel编译器代码在里面,但我移植了我写的C前段代码。但那是几年后的事了;一开始,我做了GNU Emacs。
GNU Emacs
我开始做GNU Emacs是1984年9月,而在1985年初的时候它就能用了。它让我使用Unix系统做文件编辑工作;没有兴趣学习使用vi 或ed,在那之前我是用其它的机器写程序的。
在那以后,人们开始想使用GNU Emacs,这带来一个问题,就是如何发布它。当然,我把它放在我自己使用的MIT的匿名FTP服务器上。(这台机器,prep.ai.mit.edu,所以成为了GNU ftp发布站;直到几年后它退役了,我们把名字改成新的FTP服务器)。但在当时,很多有兴趣的人并没有联上互联网而且不能通过FTP得到拷贝,所以问题是,我该怎么跟他们讲?
我可以说:“找个上网的朋友帮你COPY一份吧”,或者使用以前PDP-10 Emacs的方法,告诉他们:“寄给我一个带子和SASe,然后我拷完Emacs之后回邮给你。“,但当时我没有工作,并且在寻求一个方法给自由软件筹集资金。所以我宣布我会寄一个带子给任何想要软件的人,收费150美元。就这样,我开始了自由软件销售生意,是现在发布整个linux系统公司的先驱者。
软件对于所有用户都是自由的吗?
如果一个软件在离开它的作者的时候是自由的,不等于说对于任何拥有它的拷贝的人都是自由的。比如说,public domain software(没有版权的软件)是自由软件;但任何人都可以使用它制作有版权的软件。同样的,很多版权保护软件可以在简单授权协议下发布版权保护的修改版本。一个典型的案例就是X Window系统。由MIT开发,使用一个许可协议作为自由软件发布,它很快被很多计算机公司移植整合。他们把X加入他们的版权保护UNIX系统,只有二进制文件,以及有保密协议。这些X的拷贝版权就不再是自由软件了。
X Window的开发者并不认为这是个问题--他们期望以及故意让这种事情发生。他们的目的不是“自由”,而是“成功”,定义是“有很多用户”。他们并不在意这些用户有自由,只要他们有数量就行。
这里产生了一个悖论情况当有两个方法统计自由的数量时,对这个问题有两个答案:“这个程序是自由的吗?”如果你使用MIT发布软件时的使用协议来判断的话, 你会说X是自由软件。但如果你是以自由使用它的用户数量来衡量X,你会说它是个版权保护软件。很多X的用户是使用版权保护UNIX系统来跑,不是自由的版本。
Copyleft 和 GNU GPL
GNU的目的是给用户自由,而不仅成为流行的。所以我们需要一个协议保护GNU软件变成版权保护软件。我们使用的这个方法叫做“COPYLEFT"⑴
COPYLEFT使用COPYRIGHT的法律,但反转它来为与之相反的目的服务:不是盗版软件,它成为一个保护软件自由的功能。
copyleft的中心思想是我们给于任何用户权力去运行程序,拷贝程序,修改程序,以及发布它的修改过的版本--但不允许用户增加限制。所以“自由软件”的定义中最重要的自由这个要素得以被拥有软件的用户保证了;他们(这个协议)成为不可分割的一部分。
作为有效的copyleft,被修改的版本也必须是自由的。这保证了基于我们工作的成果在社区中发布的时候是能用的。当程序员自愿为GNU软件作出贡献的时候,copyleft可以防止他们的雇主说“你不能共享修改过的版本,因为我们将用它制作我们的专利保护程序。”
修改版本必须是自由的这一点可以保护使用这个软件的每一个用户。私有化X window的公司通常对之进行了一定的修改以移植到他们的系统和硬件中。虽然这些修改相对于X来说是小意思,但他们并不是无意义的。如果修改程序成为反对用户拥有自由的借口,那它将会被任何人使用这个借口。
我们已经证明了我们的能力胜任开发很多系列的自由软件。但这并不是说我们是不可战胜和所向无敌的。一些挑战使自由软件的未来不明朗;克服它们需要坚定不移的努力和持续的忍耐力,有时甚至需要数年的坚持。这将需要人们显示他们对自由这个价值观的决断的坚持并表示不会让任何人剥夺它。接下来的四个部分讨论这些挑战。
Secret hardware
硬件制造商不断增加这种趋势让硬件参数成为秘密。这会阻挠Linux和XFree86写新的驱动程序支持新硬件。今天我们有完整的自由操作系统,但我们如果明天不能支持新的硬件那就没有了。
有两个方法对付这个问题。程序员可以用反向工程来弄明白如何支持新硬件。其他人则选择那些能够被自由软件支持的硬件。只要我们的人数 不断增加,硬件信息保密会成为一种自我毁灭的策略。
反向工程是个很大的工程;我们将来有程序有足够的决断力承担它吗?是的--如果我们能够建立一个强力的信念,自由软件是一个大是大非的原则问题,非自由的驱动程序是不能容忍的。而我们有一大帮人会额外出钱,或甚至付出点时间,让我们能使用自由的驱动?是的,如果获得自由的信念能够被广为传播。
(2008年的笔记:这个问题也扩展到BIOS。有一个自由的BIOS,coreboot;问题是获得新硬件的微代码使coreboot能够支持它们。)
非自由的库
一个非自由库在自由的操作系统上运行成为一个给开发者的陷阱。库中有吸引力的功能成为诱饵;如果你使用了这个库,你就掉进了陷阱,因为你的程序会因为不能在自由操作系统中使用而成为废品。(严格来说,我们可以包含你的程序,但当库文件不存在时将不能运行。)甚至更糟糕的是,当使用了版权保护的程式库的程序变得流行起来,它会吸引更多程序员掉入这个陷阱。
这个问题的第一次发生是Motif 工具包,在80年代。虽然当时还没有一个自由的操作系统,Motif将会带来的问题已经显现了。GNU项目出现了两种反应:请求独立的自由软件项目支持自由的X工具包,就如Motif一样,另一个则是找人写一个Motif的替代品。这工作用了很多年;LessTif,由Hungry写了出来,已经足够强大支持多数的Motif应用程序,时间是1997年。
在1996年到1998年间,另一个非自由的图形界面工具库,叫做Qt,曾经是一个自由软件的重要组成部分--KDE桌面系统。
自由的GNU/Linux系统不能使用KDE,因为我们不能使用它的程式库。不管怎样,有些GNU/Linux的商业发行版没有严格遵循自由软件的精神整合了KDE进入他们的系统--制造出一个有更多功能,但自由更少的系统。KDE小组曾积极地鼓励更多的程序员使用Qt库,成百万的新“Linux 用户”从来没有发现这里有问题。这种情况非常糟糕。
自由软件社区以两种方式回应这个问题:GNOME和Harmony。
GNOME,GNU 网络物件模型环境(GNU Network Object Model Environment),是GNU的桌面环境项目。从1997年开始,领导者是Miguel de Icaza,在红帽公司的支持下开发,GNOME提供了相似的桌面功能,但排外地全部使用自由软件。它拥有很多技术优势,例如支持多语言,不仅是C++。但它的主要目的是自由:不需要任何非自由的软件。
Harmony是一个兼容的替代程式库,设计目的是不需要Qt运行KDE软件。
在1998年11月,Qt的开发者宣布改变发布协议,把Qt变成自由软件。虽然没办法证实,但我想这个原因是因为社区对于Qt不是自由软件的坚实的反击。(新的发布协议是不方便和不公正的,所以仍然不鼓励使用Qt)。
[后续的笔记:在2000年9月,Qt完全使用GNU的GPL协议发布,最终解决了这一问题。]
我们将如何面对下一个有吸引力的非自由程式库?整个社区将会明白避免掉入陷阱的重要性吗?或者我们会有很多人放弃了自由而选择便捷,从而产生根本性的麻烦?我们的未来取决于我们的哲学思考。
软件的专利
我们面对的最大威胁是软件专利,能够把算法和软件功能排除在自由软件之外长达20年。LZW压缩算法曾在1983年受到保护,而我们一直不能发布合适的GIF图片压缩程序。在1998年,一个压缩MP3的自由软件由于专利保护法律的原因被从发行版中移除。
有一些方法对付专利保护:我们可以搜集证据证明版权是非法的,而且我们也可以寻找另一方法做到相同的事情。但所有的这些方法只是有时候生效;当都失败的时候,自由软件将会失去用户希望有的功能。当这种事情发生的时候我们要怎么办?
那些坚持自由软件价值观的人们会无论如何一直守护自由软件。我们会用没有专利保护的方法做到相同的事情。但有些希望自由软件在技术上有优势的人会把这种事情视为失败。因此, 当谈论“大主教式”开发模式⑴的效率,可用性和自由软件的力量的时候,我们不能停在那儿,我们必须要传递自由和原则。
⑴可能写成 "bazaar模式“会更明确些,可以减少争议
自由的文档
我们的自由操作系统最大的不方便不是软件,而是--能包括在我们系统中的自由的文档。文档在任何软件包中都是相当重要的;当一个自由软件没有好的自由的手册,那是个很大的坎,今天我们有很多这样的坎。
自由的文档,像自由软件一样,是一个自由的重要要素,不是价格。一个自由手册的标准与自由软件相同:给于所有的用户特定的自由。发行(包括商业的)必须被允许,在线或纸质,所以所有程序的拷贝都要附带一份。
允许被修改也是很重要的。作为一个通用的规则,我不相信允许人们修改所有的文章和书是必要的。例如,我不认为我或你会允许去修改这篇文章,描述我们的行为或视角。
但有一个重要的理由为什么允许修改自由软件的文档是重要的。当人们行使他们的权力去修改程序,增加或改变功能,如果他们认真地更改手册--所以他们能提供准确和可用的手册给他们的程序。如果一个手册不能允许程序员认真地完成他们的工作,就不符合社区的需要。
有一些限制关于如何修改是没问题的。例如,保留原作者的版权声明,发行协议,或作者的列表,都是OK的。当然对于软件作出了哪些的修改的列表也是没问题的,甚至是与技术无关的段落,整段保留。这些限制都不是问题因为它们不会阻止认真的程序员修改手册以适应修改过的程序。换句话说,这样不会阻止社区充分利用手册。
不管怎样,手册的技术部分必须能够被修改,以及使用任何的发布方式发布它,通过所有通常的渠道;不然的话,这些限制就会阻碍社区,手册不是自由的,那我们就需要另外的手册。
我们的软件开发人员将会有足够的觉悟和决断力去制作全系列的自由手册吗?再一次,我们的未来取决于我们的哲学。
我们必须谈论自由
现在大概的统计有千万的GNU/Linux用户,比如Debian GNU/Linux和红帽Linux,自由软件发展出一些现实的优势令到用户使用他们是为了纯粹现实的理由。
这个事情的好的结果很明显:对于自由软件更多的兴趣,自由软件业更多的客户,鼓励公司去开发更多的自由软件而不是专利保护软件。
但对于软件的兴趣的增加快于对于它的哲学思考,而这会引出问题。我们面对挑战的能力和应对上面描述的威胁取决于我们对于自由价值观的坚持。确保我们的社区有这个理想,我们需要把这个思想介绍给刚加入社区的人们。
但我们在这件事情上失败了:我们吸引新用户加入的速度大大快于我们教他们我们社区公民学的速度。我们需要两件事都做,两手抓,两手都要硬,保持平衡。
“开源”
在1998年教新用户关于自由的思想变得更难了,当社区决定使用“开源软件”而不是“自由软件”开始。
一些人喜欢这个词是因为可以避免“free“这个单词的”免费“的意思--一个逻辑正确的目标。其他人,不管怎样,不理会自由软件运动和GNU项目的精神,其中有很多人是那些把利润放在自由之上,在社区之上,在原则之上的人,是呼吁商业运作的用户和执行官们。因此,“开源”这个词在修辞学上重点是如何制作高质量,强大的软件,而没有了自由,社区和原则。
Linux杂志是这个情况的样板--他们满是专利软件的广告但运行在GNU/Linux之上。当下一个Motif或Qt出现的时候,这些杂志会警告程序员们远离它们呢,还是在上面刊登它们的广告呢?
商业运作可以给社区带来很多好处;只要是公平的,都是有用的。但如果用牺牲自由和原则来获得他们的支持是灾难性的;它会令到以前已经不平衡的缺失的公民教育更糟糕。
“自由软件”和“开源”描述了相同性质的软件,差不多,但却描述了软件的不同的东西,关于价值观。GNU项目继续使用“自由软件”这个词汇,来阐释关于自由的理想,不仅是技术上的,这非常重要。
尝试!
Yoda的哲学(“There is no 'try'")听起来不错,但对我不起作用。在我做大多数工作的时候我都在担忧我能否胜任这个工作,也不确定我是否能达到目标。但不管怎样我尝试了,因为除了我之外没有人站在我的城市和敌人之间。我自己也感到惊讶,有时候我胜利了。
有时我失败了;我的一些城市沦陷了。然后我发现了另一个受到威胁的城市,然后准备下一场战斗。长久以来,我学会了看出威胁以及把我放在我的城市和他们之间,招集其他的黑客加入我。
现在,很多时候我不是一个人在战斗。当我看到黑客军团在奋力守住战线的时候我感到宽慰,我也明白,这个城市将会生存下去--现在。但危险每一年都在增强,现在微软也在把我们社区视为要消灭的目标。我们不能把我们的未来的自由寄望于被赐于的。不要接受被赐于的自由!如果你想保留你的自由,你必须准备捍卫它。
GNU 项目(开源社区的由来,背后的哲学)的更多相关文章
- Android 开源项目 eoe 社区 Android 客户端(转)
本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,采用侧边菜单栏.可以学习一下.点击此处查看 GitHub ...
- Android 开源项目 eoe 社区 Android 客户端
本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,采用侧边菜单栏.可以学习一下.点击此处查看 GitHub ...
- DevOps|乱谈开源社区、开源项目与企业内部开源
之前的一篇文章<从特拉斯辞职风波到研发效能中的荒唐事>中关于企业内源的内容在研发效能群内引起了大家的热烈讨论.有的小伙伴不同意,有的小伙伴非常不同意,我觉得这都是非常正常的反馈,话不说不透 ...
- 做一名开源社区的扫地僧——从Bug report到Google Summer of Code(GSoC):从200个bug到5000美金
今年的软件自由日(SFD),我在广州Linux用户组的线下活动上做了一个分享,主题叫做<做一名开源社区的扫地僧(上)>.我把演讲的内容重新整理扩充, 写出了文字版, 希望可以跟更多朋友分享 ...
- Linux内核版本 uname命令 GNU项目 Linux发行版
1.内核版本由linux内核社区统一编码和发布,格式如下图: major.minor.patch-build.desc 主版本号.次版本号.对次版本号的修订次数-编译次数.当前版本的特殊信息 次版本号 ...
- 为开源社区尽一份力,翻译RocketMQ官方文档
正如在上一篇文章中写道:"据我所知,现在RocketMQ还没有中文文档.我打算自己试着在github上开一个项目,自行翻译."我这几天抽空翻译了文档的前3个小节,发现翻译真的不是一 ...
- Linux已经全然统治了这个世界:反对开源社区愚不可及
原文来自:http://readwrite.jp/archives/9977 不管一个企业多强大,它都不存在和开源社区抗衡的实力 十年前.Unix占有最快的计算机世界排名前10位的五席,以及超级计算机 ...
- 积极拥抱.NET Core开源社区
潘正磊在上海的Tech Summit 2018 大会上给我们的.NET Core以及开源情况带来了最新信息. .Net Core 开源后取得了更加快速的发展,目前越活跃用户高达400万人,每月新增开发 ...
- 算法工程师想进一步提高竞争力?向TensorFlow开源社区贡献你的代码吧
算法工程师为什么也要向社区贡献代码? [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] “做算法的人要熟悉算法框架源码吗?算法工程师难 ...
随机推荐
- sscanf()函数的用法
来自:http://blog.csdn.net/tigerjibo/article/details/6442151 sscanf 名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. ...
- Android物业动画研究(Property Animation)彻底解决具体解释
前p=1959">Android物业动画研究(Property Animation)全然解析具体解释上已经基本展示了属性动画的核心使用方法: ObjectAnimator实现动画 ...
- JS Tree
jQuery插件实例七:一棵Tree的生成史 在需要表示级联.层级的关系中,Tree作为最直观的表达方式常出现在组织架构.权限选择等层级关系中.典型的表现形试类似于: 一颗树的生成常常包括三个部分:1 ...
- utf8 和 UTF-8 在使用中的差别
在使用中经常遇到utf-8和utf8,如今最终弄明确他们的使用不同之处了,如今来和大家分享一下,以下我们看一下utf8 和 UTF-8 有什么差别 "UTF-8"是标准写法,ph ...
- leetcode先刷_Merge Two Sorted Lists
非常easy问题. 唯一的地方可以具有更具挑战是确保不会引入额外的空间.查找开始值最小的名单列表的新掌门人,头从列表中删除.其他操作应该没有问题. class Solution { public: L ...
- Enum:枚举
原文:Enum:枚举 枚举 (enum) 是值类型的一种特殊形式,它从 System.Enum 继承而来,并为基础的基元类型的值提供替代名称.枚举类型有名称.基础类型和一组字段.基础类型必须是一个内置 ...
- angular实例
angular实例教程(用来熟悉指令和过滤器的编写) angular的插件太少了, 所以很多指令和过滤器都要自己写, 所以对指令传进来的参数, 以及angular编译的流程更加熟悉才行写出好的插件 ...
- android rawquery和query对照
Cursor cursor = db.rawQuery("select name from *** where id=? ", new String[]{"1" ...
- windows 开机自动登录,或者说是开机后自动进入桌面
这篇文章,对于XP以及XP以上版本有效,包括Windows Server服务器操作系统. 1.原理 --Windows自动登录的原理是,开始后,自动输入登录所使用的账号的用户名和密码,并且自动进入桌面 ...
- SQL点滴22—性能优化没有那么神秘
原文:SQL点滴22-性能优化没有那么神秘 经常听说SQL Server最难的部分是性能优化,不禁让人感到优化这个工作很神秘,这种事情只有高手才能做.很早的时候我在网上看到一位高手写的博客,介绍了SQ ...