Web应用程序安全公司Netsparker使用他们的自动化安全扫描工具,对396 个Web应用程序进行了扫描,发现了269个安全漏洞,其中最多的漏洞是跨站点脚本(XSS)和SQL注入(SQLI)漏洞,占到全部漏洞数量的87%,其中甚至还有多个零日漏洞。

对每个漏洞类别细分,研究人员发现了180个 XSS漏洞,如反射XSS,存储XSS等等,占到全部漏洞的67%, XSS漏洞占扫描发现所有安全漏洞的67%;其次是SQL注入漏洞,数量有55个,占到全部漏洞数量20%。第三名是远程和本地文件包含漏洞,数量有16 个,包括跨站请求伪造(CSRF),远程命令执行(RCE)命令注入,打开重定向,HTTP头注入和框架注入等漏洞。

这次扫描还统计了开源应用程序使用的编程语言种类,其中大多数使用PHP编程,有326个,其次使用ASP / ASP.NET进行编程,有31个。其他39应用程序使用超过10种不同技术组合构建。软件开发环境如此多样化,也是导致大量安全漏洞的原因之一。

关于寨卡病毒,最主要的问题就是我们对于它了解的太少了。这意味着我们需要尽快对它作出很多研究。

寨卡病毒现已严重威胁到世界人民的健康。在 2015 年爆发之后,它就成为了全球性的突发公共卫生事件,并且这个病毒也可能与儿童的出生缺陷有关。根据维基百科,在这个病毒在 40 年代末期被发现以后,早在 1952 年就被观测到了对于人类的影响。

在 2 月 10 日,开放杂志 PLoS 发布了一个声明,这个是声明是关于有关公众紧急状况的信息共享。在此之后,刊登在研究期刊 F1000 的一篇文章 对于能治疗寨卡病毒的开源药物Open drug的研究,它讨论了寨卡病毒及其开放研究的状况。那篇来自 PLoS 的声明列出了超过 30 个开放了对于寨卡病毒的研究进度的数据的重要组织。并且世界卫生组织实施了一个特别规定,以创作共用许可证公布提交到他们那里的资料。

快速公布,无限制的重复利用,以及强调研究结果的传播是推动开放科研社区的战略性一步。看到我们所关注的突发公共卫生事件能够以这样的方式开始是很令人受鼓舞的。


via: https://opensource.com/life/16/2/how-rapid-open-science-could-change-game-zika-virus

作者:Marcus D. Hanwell 译者:name1e5s 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

“特立独行”的Ubuntu手机,未来的生存空间几何? 

在MWC 2016上,魅族和Canonical联合展出了Ubuntu版魅族Pro 5;与此同时,魅族官网也已经开启了Ubuntu版魅族Pro 5的预定。这是魅族继去年5月份的Ubuntu版MX4之后推出的第二款Ubuntu手机,也是全球范围内发售的第四款Ubuntu手机。

自然会有一批Ubuntu的粉丝为这款旗舰新品的到来而感到欢欣。但是即使这款产品有幸没能成为这个小众手机操作系统的回光返照,那我们也有理由担心在安卓和iOS的统治之下Ubuntu未来会拥有怎样逼仄的生存空间。

Ubuntu的五个特征

Ubuntu这个词汇来自于非洲南部祖鲁语,意为“博爱”或者是“天下共享”;它于2004年被来自南非的企业家马克Mark Shuttleworth命名为旗下Linux开源项目的名称。在前移动互联网时代,Ubuntu作为一款桌面操作系统被许多非Windows&MAC用户安装在自己的桌面电脑上。

随着移动互联网的滚滚浪潮到来,Ubuntu也被裹挟其中。2012年,Ubuntu发布了“Ubuntu for Android”,这是一个可以使用户在安卓系统中运行的嵌入式全功能系统包,可以在外部连接显示屏的情况下帮助用户实现更多功能。

但显然,Ubuntu for Android对安卓的依附性太过明显,而且对手机处理能力的要求过高,很难真正赢得用户

2013年1月,Ubuntu的开发商Canonical宣布推出独立的Ubuntu移动版操作系统。该系统主要有以下几个特点值得关注:

  1. 跨越硬件平台的使用体验。Ubuntu的ROM同时支持ARM和X86两大处理器架构,也就意味着能够同时运行在移动端的桌面端设备上,并且通过数据连接、同步和共享实现融合。这种理念与微软的Windows 10系统如出一辙。
  2. 对开发者非常友好。Ubuntu向开发者提供了两种开发模式:通过SDK开发的原生App和基于HTML5的Web App。尤其是后者,其可以在调用深层API接口的情况下,实现与原生APP一致的外观与功能,并且可以从同一个应用商店下载。
  3. 更为彻底的触控操作体验。这也是Ubuntu系统在用户操作方式上的独特和新奇之处。通过从上下左右四个边缘的滑动,就完全可以实现安卓上需要专门配备的Home键、返回键和多任务键的所有功能。从用户的角度而言,会体验到一种极为纯粹的触控操作体验。
  4. 与众不同的内容呈现方式。安卓和iOS的内容呈现都是以APP为单位的,但是Ubuntu提出了一个名为Scope的内容呈现方式,将设备上同一类的不同内容整合在同一个Scope中,使得用户更加清晰和直观地到达内容本身。
  5. 高颜值。Ubuntu甫一露面就惊艳众人,其系统界面继承了Ubuntu桌面版的审美风格,锁屏界面显得颇为神秘简约。这也是Ubuntu吸引人的一个重要元素。

“特立独行”的Ubuntu手机,未来的生存空间几何?

Ubuntu的商业化之路

在上述看起来颇为吸引人的使用特征之下,Ubuntu创始人马克对这款全新移动操作系统的未来颇有信心。在发布两个月之后,马克在接受中国媒体采访时表示,Ubuntu智能手机和平板电脑将于第二年,也就是2014年进入中国市场。

只不过,马克似乎过于自信了。2013年iOS和安卓如日中天,并且处于急速发展的状态;中国智能手机的发展更是如火如荼;而Ubuntu才刚刚面世,在时机上已经晚了很多。更何况,Ubuntu在自身的功能上还有诸多不完善之处。

当然,对于Ubuntu而言,它肯定是要按照自己的路来走的。

2013年7月,Canonical在Indiegogo上发起了一个众筹项目,打算在一个月内筹集3200万美元来打造一部名为Ubuntu Edge的超级手机。一个月后,Canonical筹集到了1281万美元;这笔金额虽然创造了一个众筹历史上的记录,但该项目依然宣告失败。

2014年2月,Canonical宣布与中国手机厂商魅族正式达成合作关系,并将为MX3手机用户提供刷机包。接着双方在2014年的MWC上展出一款搭载Ubuntu的MX3手机。

Ubuntu之所以选择与魅族合作,大概是因为2013的魅族特立不凡的小众气质Ubuntu系统相呼应;而且在国内的厂商中,唯有魅族采用了“小圆圈”式的单一按键方案,这与Ubuntu的全触控操作方案也最为相合。当然站在魅族的角度,一方面可以借Ubuntu来扩大自身国际知名度,另一方面也有“别把鸡蛋放在一个篮子里”的顾虑。

然而,就在人们以为Ubuntu版MX3为期不远的时候, 魅族内部也发生了变革。同样是在2014年2月,黄章回归魅族,开始寻求魅族新的发展方向,比如说引进融资、丰富产品线、价格体系下沉、加大市场营销等。

很难说黄章在2014年的回归究竟在多大意义上影响了Ubuntu版 MX3的命运,但我们看到的结果是:不仅没有Ubuntu 版MX3这款产品的存在,甚至连此前双方宣布合作时所说的MX3 刷机包都没有着落

于是在智能手机高速发展红利进入最后一年的2014年,Ubuntu系统依然没有通过硬件产品落地。

另外一个更加严峻的问题是:作为一款移动操作系统,开发者的认同和支持也至关重要。Ubuntu在没有实质性消费者用户的情况下,很难会进入到开发者的视野。从某种意义上来说,Ubuntu MX3的难产也加重了这个问题的严重性。

为此,Ubuntu还选择与中国移动合作。双方在2014年底发起了Ubuntu开发者创新大赛。该大赛旨在面向开发者公开征集优秀适配Ubuntu操作系统的Scope、应用等作品,共同打造Ubuntu生态。当然,所有参赛作品要在Ubuntu商店上线。

2015年8月,该赛事已经结束;据官方称有上千名开发者参与其中。通过这个数字,可以想见Ubuntu商店的应用数量与安卓和iOS相比,依然处于极其匮乏的状态。

Ubuntu手机问世之后

2015年2月,第一款搭载Ubuntu系统的智能手机终于问世。Canonical公司联合西班牙BQ公司推出了一款名为Aquarius E4.5的Ubuntu手机。

BQ是一家成立于2005年的西班牙设备厂商。在智能手机的发展策略上,BQ公司定位于中低端市场,为用户提供较为廉价的手机。正是在这一策略下,BQ在2013年度实现了旗下智能手机销量翻三倍的目标。

当然,这可能也是Canonical选择与BQ合作的一个重要原因。

这款搭载Ubuntu的Aquarius E4.5同样定位于中低端,无论是该机的相对低端配置还是170欧元的价格,都注定了它是一款走量的产品。当然,站在Ubuntu的角度,它也的确需要一款性价比较高、能够迅速铺开的机型来推广自己的系统。

这款Ubuntu版Aquarius E4.5手机不仅仅在西班牙发售,也在其他欧洲国家全面上市。几个月后,双方有联合推出了升级版:Aquarius E5。

当然,在中国这边,Canonical依然与魅族保持着合作关系。在2015年3月份召开的MWC2015上,双方展出了搭载Ubuntu系统的MX4;两个月之后,MX4 Ubuntu开发者版本在国内发售,但是这场发售只持续了三天左右。6月份,MX4 Ubuntu版在欧洲上市。

“特立独行”的Ubuntu手机,未来的生存空间几何?

很明显,黄章回归之后的魅族在产品线、营销策略和产品气质等方面的诸多调整之后,其与Canonical之间的合作关系似乎越来越趋于淡化。魅族更多地把Canonical作为其在国外打开知名度和影响力的跳板,而没有多少心思在国内推出面向消费者的Ubuntu手机。魅族在2015年拥有2000万台的爆发式手机销量,但与Ubuntu没有任何关系。

令人欣慰的是,Ubuntu还活着。在2016年MWC上,搭载Ubuntu的魅族Pro 5手机和BQ Aquarius M10平板电脑出现在展台上,再次吸引了人们的关注。与此同时,Ubuntu 版魅族Pro 5在官网开启了预定。

不过,当智能手机的发展已经进入饱和状态,当安卓和iOS系统生态的发展已经高度成熟,当人们对于智能手机的选择愈发趋于理性,又有多少人会仅仅因为操作系统的与众不同而选择一款两千多元的产品呢?

函数是实现程序功能的最基本单位,每一个程序都是由一个个最基本的函数构成的。写好一个函数是提高程序代码质量最关键的一步。本文就函数的编写,从函数命名,代码分布,技巧等方面入手,谈谈如何写好一个可读性高、易维护,易测试的函数。

命名

首先从命名说起,命名是提高可读性的第一步。如何为变量和函数命名一直是开发者心中的痛点之一,对于母语非英语的我们来说,更是难上加难。下面我来说说如何为函数命名的一些想法和感受:

采用统一的命名规则

在谈及如何为函数取一个准确而优雅的名字之前,首先最重要的是要有统一的命名规则。这是提高代码可读性的最基础的准则。
帕斯卡命名法和驼峰命名法是目前比较流行的两种规则,不同语言采用的规则可能不一样,但是要记住一点:保持团队和个人风格一致。

1、帕斯卡命名法

帕斯卡命名法简单地说就是:多个单词组成一个名称时,每个单词的首字母大写。比如:

public void SendMessage ();
public void CalculatePrice ();

在C#中,这种命名法常用于类、属性,函数等等,在JS中,构造函数也推荐采用这种方式命名。

2、驼峰命名法

驼峰命名法和帕斯卡命名法很类似,多个单词组成一个名称时,第一个单词全部小写,后面单词首字母大写。比如:

var sendMessage = function () {};
var calculatePrice = function () {};

驼峰命名法一般用于字段、局部变量、函数参数等等。在JS中,函数也常用此方法命名。

采用哪种命名规则并不绝对,最重要的是要遵守团队约定,语言规范。

尽可能完整地描述函数所做的所有事情

有的开发者可能觉得相较于长函数名来说,短函数名看起来可能更简洁,看起来也更舒服。但是通常来说,函数名称越短其描述的意思越抽象。函数使用者对函数的第一印象就是函数名称,进而了解函数的功能,我们应该尽可能地描述到函数所做的所有事情,防止使用者不知道或误解造成潜在的错误。

举个例子,假设我们做一个添加评论的功能,添加完毕后并返回评论总数量,如何命名比较合适呢?

// 描述不够完整的函数名
var count = function addComment() {};

// 描述完整的函数名
var count = function addCommentAndReturnCount() {};

这只是简单的一个例子,实际开发中可能会遇到得更多复杂的情况,单一职责原则是我们开发函数要遵守的准则,但是有时候无法做到函数单一职责时,请记得函数名应该尽可能地描述所有事情。当你无法命名一个函数时,应该分析一下,这个函数的编写是否科学,有什么办法可以去优化它。

采用准确的描述动词

这一点对母语非英语的开发者来说应该是比较难的一点,想要提高这方面的能力,最主要的还是要提高词汇量,多阅读优秀代码积累经验。

这里简单说说我自己的一些感想和看法:

1、不要采用太抽象广泛的单词

很多开发人员会采用一个比较宽泛的动词来为函数命名,最典型的一个例子就是get这个单词。我们平时开发中经常会通过各种不同的方式拿到数据,但是每一种方式都用get就有点太抽象了。具体如何命名,要具体分析:

(1)简单的返回数据

Person.prototype.getFullName = function() {
    return this.firstName = this.lastName;
}

(2)从远程获取数据

var fetchPersons = function () {
    ...
    $.ajax({
    })
}

(3)从本地存储加载数据

var loadPersons = function () {};

(4)通过计算获取数据

var calculateTotal = function () {};

(5)从数组中查找数据

var findSth = function (arr) {};

(6)从一些数据生成或得到

var createSth = function (data) {};
var buildSth = function (data) {};
var parseSth = function(data) {};

这是一个简单的例子,我们平时开发中遇到的情况肯定会复杂得多,关键还是靠单词的积累,多阅读优秀源码

下面是整理的一些常用的对仗词,大家可以参考使用

add/remove        increment/decrement       open/close
begin/end            insert/delete                      show/hide
create/destory    lock/unlock                        source/target
first/last              min/max                             star/stop
get/put                next/previous                     up/down     
get/set                old/new

根据不同项目和需求制定好命名规则

这一点也是很重要的,尤其是在团队合作中,不同的项目和需求可能导致的不同的命名规则。

比如我们通常采用的命名规则是动宾结构,也就是动词在前,名词灾后。但是有一些项目,比如数据接口等项目中,有的团队会采用名字在前,动词在后的形式,例如:

var sendMessage = function () {};
var calculatePrice = function () {};

0

这种的好处是看到前面的名词,比如ProductsGet,就能很快的知道这是产品相关的数据接口。
当然这个并不是绝对的,关键还是要团队共同制定和遵守同一套命名规则。

函数参数

函数使用者在调用函数时,必须严格遵守函数定义的参数,这对函数的易用性,可测试性等方面都是至关重要的。下面我从几个方面来谈谈关于如何优化好函数参数的一些想法。

参数数量

毫无疑问,函数参数越多,函数的易用性就越差,因为使用者需要严格眼中参数列表依次输入参数,如果某个参数输错,将导致不可意料的结果。

但是,函数参数就一定越少越好吗?我们来看看下面的例子:

var sendMessage = function () {};
var calculatePrice = function () {};

1

在这个例子中,我们通过calculatePrice这个函数来计算价格,函数不接收任何参数,直接通过两个全局变量unitPrice和count进行计算。这种函数的定义对使用者来说非常方便,直接调用即可,不用输入任何参数。但是这里可能会有潜在的bug:全局变量可能在其他地方被修改成其他值了,难以进行单元测试等等问题。所以,这个函数可以传入数量和价格信息:

var sendMessage = function () {};
var calculatePrice = function () {};

2

这种方式下,函数使用者在使用时,要传入参数进行调用,避免了全局变量可能存在的问题。另外也降低了耦合,提高了可测试性,在测试的时候就不必依赖于全局变量。

当然,在保证函数不依赖于全局变量和测试性的情况下,函数参数还是越少越好。《代码大全》中提出将函数的参数限制在7个以内,这个可以作为我们的参考。

有的时候,我们不可避免地要使用超过10个以上函数,在这中情况下,我们可以考虑将类似的参数构造成一个类,我们来看看一个典型的例子。

我相信大家平时一定做过这样的功能,列表筛选,其中涉及到各种条件的筛选,排序,分页等等功能,如果将参数一个一个地列出来必定会很长,例如:

var sendMessage = function () {};
var calculatePrice = function () {};

3

这是一个筛选酒店的函数,其中的参数分别是城市,入住和退房时间,价格,星级,位置,是否有wifi,是否有早餐,排序,页码等等,实际的情况可能会更多。在这种参数特别多的情况下,我们可以考虑将一些相似的参数提取成类出来:

var sendMessage = function () {};
var calculatePrice = function () {};

4

将多个参数提取成对象了,虽然对象数量增多了,但是函数参数更清晰了,调用起来也更方便了。

尽量不要使用bool类型作为参数

有的时候,我们会写出使用bool作为参数的情况,比如:

var sendMessage = function () {};
var calculatePrice = function () {};

5

如果没有注释,使用者看到这样的代码:getProduct(true),他肯定搞不清楚true是代表什么意思,还要去查看函数定义才能明白这个函数是如何使用的。这就意味着这个函数不够清晰,就应该考虑去优化它。通常有两种方式去优化它:

  1. 将函数一分为二,分成两个函数getFinishedProduct和getUnFinishedProduct
  2. 将bool转换成有意义的枚举getProduct(ProductStatus)

不要修改输入参数

如果输入参数在函数内被修改了,很有可能造成潜在的bug,而且使用者不知道调用函数后居然会修改函数参数。
正确使用输入参数的做法应该是只传入参数用于函数调用。

如果不可避免地要修改,一定要在注释中说明。

尽量不要使用输出参数

使用输出参数说明这个函数不只做了一件事情,而且使用者使用的时候可能还会感到困惑。正确的方式应该是分解函数,让函数只做一件事。

编写函数体

函数体就是实现函数功能的整个逻辑,是一个函数最关键的地方。下面我谈谈关于函数代码编写的一些个人想法。

相关操作放在一起

有的时候,我们会在一个函数内进行一系列的操作来完成一个功能,比如:

var sendMessage = function () {};
var calculatePrice = function () {};

6

这段代码计算了房间价格和早餐价格,然后将两者相加返回总价格。

这段代码乍一看,没有什么问题,但是我们分析代码,我们先是分别获取了房间数量和早餐数量,然后再通过房间数量和早餐数量分别计算两者的价格。这种情况下,房间数量和计算房间价格的代码分散在了两个位置,早餐价格的计算也是分散到了两个位置。也就是两部分相关的代码分散在了各处,这样阅读起代码来逻辑会略显不通,代码组织不够好。我们应该让相关的语句和操作放在一起,也有利于重构代码。我们修改如下:

var sendMessage = function () {};
var calculatePrice = function () {};

7

我们将相关的操作放在一起,这样代码看起来更清晰了,而且也更容易重构了。

尽量减少代码嵌套

我们平时写if,switch或for语句是常有的事儿,也一定写过多层if或for语句嵌套的情况,如果代码里的嵌套超过3层,阅读起来就会非常困难了。我们应该尽量避免代码嵌套多层,最好不要超过2层。下面我来说说我平时一些减少嵌套的技巧或方法。

if语句嵌套的问题

多层if语句嵌套是常有的事情,有什么好的方法可以减少嵌套呢?

1、尽早终止函数或返回数据

如果符合某个条件下可以直接终止函数,则应该将这个条件放在第一位。我们来看看下面的例子。

var sendMessage = function () {};
var calculatePrice = function () {};

8

这段代码中if语句嵌套了3层,看起来已经很复杂了,我们可以将最后面的return提取到最前面去。

var sendMessage = function () {};
var calculatePrice = function () {};

9

这段代码中,我们把condition1等于false的语句提取到前面,直接终止函数,将多层嵌套的if语句重构成只有一层if语句,代码也更清晰了。

注意:一般情况下,我们写if语句会将条件为true的情况写在前面,这也比较符合我们的思维习惯。如果是多层嵌套的情况,应该优先减少if语句的嵌套

2、不适用if语句或switch语句

条件语句一般来说是不可避免的,有的时候,我们要判断很多条件就会写很多if-elseif语句,嵌套的话,就更加麻烦了。如果有一天增加了新需求,我们就要去增加一个if分支语句,这样不仅修改起来麻烦,而且容易出错。《代码大全》提出的表驱动法可以有效地解决if语句带来的问题。我们来看下面这个例子:

// 描述不够完整的函数名
var count = function addComment() {};

// 描述完整的函数名
var count = function addCommentAndReturnCount() {};

0

这段代码分别依次判断了四种情况,如果再增加一种情况,我们就要再新增一个if分支,这样就可能造成潜在的问题,如何去优化这段代码呢?我们可以采用一个Map或Dictionary来将每一种情况和相应值一一对应。

// 描述不够完整的函数名
var count = function addComment() {};

// 描述完整的函数名
var count = function addCommentAndReturnCount() {};

1

通过map优化后,整个代码不仅更加简洁,修改起来也更方便而且不易出错了。

当然,很多时候我们的条件判断语句并不是这么简单的,可能会涉及到复杂的逻辑运算,大家可以查看《代码大全》第18章,其中有详细的介绍。

3、提取内层嵌套为一个函数进行调用

多层嵌套的时候,我们还可以将内层嵌套提取到一个新的函数中,然后调用该函数,这样代码也就更清晰了。

for循环嵌套优化

for循环嵌套相比于if嵌套来说更加复杂,阅读起来会更麻烦,下面说说几点要注意的东西:

  1. 最多只能两层for循环嵌套
  2. 提取内层循环到新函数中
  3. 多层循环时,不要简单地位索引变量命名为i,j,k等,容易造成混淆,要有具体的意思

提取复杂逻辑,语义化

有的时候,我们会写出一些比较复杂的逻辑,阅读代码的人看到后可能搞不清楚要做什么,这个时候,就应该提取出这段复杂的逻辑代码。

// 描述不够完整的函数名
var count = function addComment() {};

// 描述完整的函数名
var count = function addCommentAndReturnCount() {};

2

这段代码表示当年龄大于18并且是男性的话,可以doSth,但是还是不够清晰,可以将其提取出来

// 描述不够完整的函数名
var count = function addComment() {};

// 描述完整的函数名
var count = function addCommentAndReturnCount() {};

3

虽说多了一个函数,但是代码更加清晰和语义化了。

总结

本文从函数命名,函数参数和函数的代码编写三个方面谈了关于如何编写好一个函数的感受和想法。文中提到了很多具体的情况,当然日常编码中肯定会遇到更多复杂的情况可能我暂时没有想到。我简单的归纳了几点:

  1. 准确地对变量、函数命名
  2. 不要有重复逻辑的代码
  3. 函数的行数不要超过20行,这里的20行只是个大概,并不一定是这个数字
  4. 减少嵌套

我相信大家一定会很多关于这方面的经验,欢迎进行交流,共同提高代码质量。

Linux一向勇猛而特立独行。这个开源旗舰平台所做的事情其他任何操作系统都无法完成,其中Live Linux发行版就是很好的例子。什么是Live Linux呢?非常好理解。一个Live Linux发行版是完全运行在RAM内存中的,所以这能让你在一张CD/DVD或是一个U盘上运行一个Linux操作系统的完整实例,而不用对电脑上现有的操作系统做任何修改。

这对你意味着什么呢?也就是说,你可以立刻找来一个Live Linux发行版来看看Linux是否适合你的操作系统,或者你可以把一个完整的Linux操作系统装在U盘里随身携带着。如果不想让电脑开机就进入Windows,只需要将装有Live Linux的U盘拿出来插入电脑,启动后做出想要的选择就可以了。

但是,哪种Live发行版的体验最佳呢?这是一个具有挑战性的问题,很容易被个人偏见所影响。一个用户最喜欢的发行版在另一个用户那里却变成了 最讨厌的,这种情况对于有个性的Linux用户来说再常见不过了。所以,我所能做的就是收集了5个发行版并且列在这里,我私下里认为它们完美的体现了Live Linux的理念。这5个Live发行版并非是专为系统管理员们提供的(他们用得着的应该是partedmagic、cloneziLLA或 SystemRescueCd这些),而是将重点放在为普通用户提供一个快速启动的完整的Linux桌面系统,不仅仅满足用户的需求,并且要将用户体验做到最好。

言归正传,下面就是我所选择的5项最佳live Linux发行版:

1.Ubuntu

Ubuntu能够在我的名单上排名榜首是有几个原因的。最主要的原因就是它非常简单——Live版本的Ubuntu是一个令人难以置信的工具, 它不仅能够展示出Linux作为操作系统能够完成的工作,而且充分诠释了Live这个词的含义。Ubuntu的硬件检测和支持做的非常棒,因此你可以完全放心的将装有Ubuntu的U盘插进电脑并启动到live模式,你会发现所有的硬件都能够被识别,并且完全正常的工作。在这些硬件之上,你还能得到一个华丽的桌面,友好程度能够媲美其他任何一种操作系统。

Ubuntu不仅提供了强大的硬件支持和现代桌面,也给用户准备好了整套完善的开箱即用的软件:浏览器、办公套件、电子邮件、多媒体——包含了一般意义上所有的用户需要的办公与娱乐工具。

有人可能会质疑我为什么要首先选择一个这样大footprint的发行版。原因很简单:现在几乎所有的现代计算机都拥有了足够的马力,足以完美运行Ubuntu的Live版本了,所以为什么不充分利用这个力量,来启动这个几乎能够满足所有用户需要的Linux发行版呢!

2.Netrunner

Netrunner Linux

Netrunner Linux引以为傲的是它的KDE Plasma环境,以及预装的一些令人惊讶的工具。除了那些已经成为标配的工具软件,你还会发现Skype、Wine、Gimp、VLC、Steam、VirtualBox和其他更多(注:Steam和VirtualBox不能有效在live环境中运行)。

Netrunner有两种不同的发行形式:标准发布和滚动发布。标准发布是基于Debian软件包管理的方式,滚动发布则集中使用了Arch的包管理方式。我在两种同样基于KDE的Linux发行版中最终选择了Netrunner的一个原因是他们成功的对在低功耗计算机上运行KWin进行了优化,这对于Live版本来说显然更为理想。除了标准的KDE面板之外,Netrunner还增加了一个非常方便的侧面板,为用户提供了更多的多媒体访问控件。你能在Netrunner中发现大量不会在其他标准KDE发行版中出现的的主题和可定制项目。

3.BunsenLabs Linux

还记得CrunchBang Linux吗?嗯,那个个性鲜明的项目已经死掉了。然而幸运的是它又被人被重新拾起来了,在BunsenLabs Linux的名字下焕发出新生命。那么BunsenLabs Linux这个发行版是怎么回事呢?它基于Debian Jessie,使用Openbox窗口管理器,并且添加了tint2面板和Conky系统监视器。

BunsenLabs Linux的了不起之处是它代表了一个工匠的梦想。它具有丰富的主题和Conky配置,这样你可以将桌面慢慢的调整成和你想象中一样的外观和感觉,而完全不会将电脑的运行速度变慢。你会发现在BunsenLabs的用户论坛中充满了具有创意的定制想法。而且BunsenLabs Linux可以运行在32位、64位,甚至基于ARM的电脑上!

BunsenLabs Linux

4.Porteus

Proteus是一个独特的小型Linux发行版(footprint低于300 MB),因为它在本质上是模块化的。与使用软件包管理器的绝大多数Linux发行版不同,Proteus使用的是预编译模块,可以快速插入运行中的操作系统。当一个模块的工作完成后,你可以关闭它,这时它就会从目录结构中消失。有了这个系统,你就可以只使用那些你所需要的功能,不让任何一个多余的模块拖慢平台的速度。你可以下载模块并把它们存储在本地,在需要时使用。Porteus同样也是以压缩的格式存储的,所以在解压缩时速度很快。此外,所有的启动脚本都被重写,极大的提高了开机和关机的速度,因此对于Live Linux来说,这确实是一个理想的体验。

5.AV Linux

首先,我需要提醒大家,AV Linux目前还并不可用,它的开发者已经删除了6.0.4版并且正在准备发布AV Linux 2016,但这是值得等待的。即便我说过不会将特定任务的发行版包含进来,但AV Linux有点不同。这个发行版是专为——你可能从名字里已经猜到了——音频/视频/图形内容创作而设计的平台。

AV Linux不是通常的Linux发行版,相反,它是一个预先配置好的Debian测试发行版的快照(目前Debian测试发行版名为Stretch)。在这个发行版中配置了Xfce 4桌面和几乎所有可能会用来创建音频和视频的软件,包括定制的Linux“RT”内核和Jack Audio Connection Kit用以降低延迟。在多媒体中心配置的软件产品大家庭中,你会发现Ardour、Audacity、Blender、Cinelerra、Handbrake、Hydrogen、Kdenlive、MuseScore、OpenShot和VLC Media Player。我希望很快能看到AV Linux 2016的正式发布。如果你属于那种有创意的音视频天才,那么你应该去看一下AV Linux。

这就是我所推荐的5个拥有优秀Live体验的Linux发行版,下载其中一个(或者把所有的都试一下),然后创建一个可携带的Live Linux驱动器,这样无论何时何地,你都可以让电脑做出进入Linux的选择了。