分类 观点 下的文章

一个人希望掌握所有的正则表达式,却耗费了大量的时间,不知室外世事变迁,早已换了一个时代。

这个漫画讽刺了一些初学者,希望掌握一些比较复杂的东西的所有内容后再去做事,却不知道,这些东西过于复杂,你花费的时间可能很快就一文不值,因为它们可能已经过时了。

开发并不要求你掌握所有的内容,更多的时候,你只要能够掌握一些常用的,在真正需要用到的时候,再去查询一些比较详细的、不常用的内容即可。毕竟,没有人要求你马上做完所有事情。


via: https://turnoff.us/geek/mastering-regexp/

作者:Daniel Stori 译者&点评:Bestony 校对&合成:wxy

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

随着物联网设备的普及,网络犯罪分子通过利用密码的缺陷而提供拒绝服务攻击。

随着物联网设备飞速发展,分布式拒绝服务(DDoS)攻击正在成为一种危险的趋势。就如 DNS 服务商 Dyn 上年秋季之遭遇 一样,黑客似乎瞄上了每个人,使用未保护的物联网设备来轰炸网络的做法正在抬头。

可雇佣的 DDoS 攻击的出现意味着即使是最不精通技术的人都能精准报复某些网站。就像在柜台前面买个东西一样方便,然后就可以彻底搞定一个公司。

根据 Neustar 的报告,四分之三的国际品牌、机构和公司都是 DDoS 攻击的受害者。每天至少会发生 3700 起 DDoS 攻击

睿科网络公司(A10 Networks)网络运营总监 Chase Cunningham 说:“想要找个可用的物联网设备,你只需要在地下网站四处打听一下 Mirai 扫描器代码,一旦你找到了,你将能够利用在线的每一台设备来进行攻击”。

“或者你可以去一些类似 Shodan 的网站,然后简单的搜一下设备特定的请求。当你得到这些信息之后,你就可以将你所雇佣的 DDoS 工具配置正确的流量模拟器类型、指向正确的目标并发动攻击。”

“几乎所有东西都是可买卖的。”他补充道,“你可以购买一个 ‘stresser’,这就是个随便哪个会点按钮的人都会使用的 DDoS 僵尸网络。”

网络安全提供商 Imperva 说,用户只需要出几十美金,就可以快速发动攻击。有些公司在它们的网站上说它们的工具包含肉鸡负载和 CnC(命令与控制)文件。使用这些工具,那些有点想法的肉鸡大师(或者被称为 herders)就可以开始传播恶意软件,通过垃圾邮件、漏洞扫描程序、暴力攻击等来感染设备。

大部分 stresser 和 booter 都会有一个常见的、基于订阅服务的 SaaS(软件即服务)业务模式。来自 Incapsula 公司的 Q2 2015 DDoS 报告 显示,在 DDoS 上的月均每小时花费是 38 美元(规模较低的是 19.99 美元)。

雇佣ddos服务

“stresser 和 booter 只是新世界的一个副产品,这些可以扳倒企业和机构的服务只能运作在灰色领域”,Imperva 写道。

虽然成本不同,但是企业受到的各种攻击,每次损失在 1.4 万美元到 235 万美元之间。而且企业受到一次攻击后,有 82% 的可能性会再次受到攻击

物联网洪水攻击 DDoS of Things (DoT)使用物联网设备建立的僵尸网络可造成非常大规模的 DDoS 攻击。物联网洪水攻击会利用成百上千的物联网设备攻击,无论是大型服务提供商还是企业,均无幸免。

“大部分讲究声誉的 DDoS 卖家都会将他们的工具配置为可修改的,这样你就可以轻松地设置攻击的类型。虽然我还没怎么看到有哪些可以‘付费的’物联网流量模拟器的选项,但我敢肯定就要有了。如果是我来搞这个服务,我是绝对会加入这个选项的。”Cunningham 如是说。

由 IDG 新闻服务的消息可知,要建造一个 DDoS 服务也是很简单的。通常黑客会租用 6 到 12 个左右的服务器,然后使用它们随意的攻击任何目标。去年十月下旬,HackForums.net 关闭了他们的“服务器压力测试”版块,这个做法就是考虑到黑客可能通过使用他们每月十美元的服务建造可雇佣的 DDoS 服务。

同样地在十二月时,美国和欧洲的执法机构 逮捕 34个参与可雇佣的 DDoS 服务的嫌犯。

但是如果这很简单,怎么还没有经常发生攻击?

Cunningham 说这其实每时每刻都在发生,实际上每天每秒都在发生。他说:”你不知道它们的原因是因为大部分都是扰乱攻击,而不是大规模的、想要搞倒公司的攻击。“

他说,大部分的攻击平台只出售那些会让系统宕机一个小时或稍长一点的攻击。通常宕机一小时的攻击大概需要花费 15 到 50 美元。当然这得看平台,有些可能一小时就要花上百美元。

减少这些攻击的解决方案是让用户把所有联网设备的出厂预置的密码改掉,然后还要禁用那些你不需要的功能。

(题图:Victor


via: http://www.csoonline.com/article/3180246/data-protection/hire-a-ddos-service-to-take-down-your-enemies.html

作者:Ryan Francis 译者:kenxx 校对:wxy

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

这篇漫画生动的解释了 Java 的垃圾回收机制:什么是垃圾回收(GC)、什么是并行垃圾回收以及什么是垃圾回收的标记清除算法。

如果你想更深入的了解,不妨看一下垃圾回收) 和并行标记清除算法


via: https://turnoff.us/geek/java-gc-explained/

作者:Daniel Stori 译者&点评:bestony 校对&合成:wxy

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

SDN 开始重新定义企业网络。这里有五个应该知道的开源项目。

纵观整个 2016 年,软件定义网络(SDN)持续快速发展并变得成熟。我们现在已经超出了开源网络的概念阶段,两年前评估这些项目潜力的公司已经开始了企业部署。如几年来所预测的,SDN 正在开始重新定义企业网络。

这与市场研究人员的观点基本上是一致的。IDC 在今年早些时候公布了 SDN 市场的一份研究,它预计从 2014 年到 2020 年 SDN 的年均复合增长率为 53.9%,届时市场价值将达到 125 亿美元。此外,“ 2016 技术趋势 Technology Trends 2016 ” 报告中将 SDN 列为 2016 年最佳技术投资。

IDC 网络基础设施副总裁,Rohit Mehra 说:“云计算和第三方平台推动了 SDN 的需求,这预示着 2020 年的一个价值超过 125 亿美元的市场。毫无疑问的是 SDN 的价值将越来越多地渗透到网络虚拟化软件和 SDN 应用中,包括虚拟化网络和安全服务。大型企业现在正在数据中心体现 SDN 的价值,但它们最终会认识到其在分支机构和校园网络中的广泛应用。“

Linux 基金会最近发布了其 2016 年度报告“开放云指南:当前趋势和开源项目”。其中第三份年度报告全面介绍了开放云计算的状态,并包含关于 unikernel 的部分。你现在可以下载报告了,首先要注意的是汇总和分析研究,说明了容器、unikernel 等的趋势是如何重塑云计算的。该报告提供了对当今开放云环境中心的分类项目的描述和链接。

在本系列中,我们会研究各种类别,并提供关于这些领域如何发展的更多见解。下面,你会看到几个重要的 SDN 项目及其所带来的影响,以及 GitHub 仓库的链接,这些都是从“开放云指南”中收集的:

软件定义网络

ONOS

开放网络操作系统 Open Network Operating System (ONOS)是一个 Linux 基金会项目,它是一个面向服务提供商的软件定义网络操作系统,它具有可扩展性、高可用性、高性能和抽象功能来创建应用程序和服务。

ONOS 的 GitHub 地址

OpenContrail

OpenContrail 是 Juniper Networks 的云开源网络虚拟化平台。它提供网络虚拟化的所有必要组件:SDN 控制器、虚拟路由器、分析引擎和已发布的上层 API。其 REST API 配置并收集来自系统的操作和分析数据。

OpenContrail 的 GitHub 地址

OpenDaylight

OpenDaylight 是 Linux 基金会旗下的 OpenDaylight 基金会项目,它是一个可编程的、提供给服务提供商和企业的软件定义网络平台。它基于微服务架构,可以在多供应商环境中的一系列硬件上实现网络服务。

OpenDaylight 的 GitHub 地址

Open vSwitch

Open vSwitch 是一个 Linux 基金会项目,是具有生产级品质的多层虚拟交换机。它通过程序化扩展设计用于大规模网络自动化,同时还支持标准管理接口和协议,包括 NetFlow、sFlow、IPFIX、RSPAN、CLI、LACP 和 802.1ag。它支持类似 VMware 的分布式 vNetwork 或者 Cisco Nexus 1000V 那样跨越多个物理服务器分发。

OVS 在 GitHub 的地址

OPNFV

网络功能虚拟化开放平台 Open Platform for Network Functions Virtualization (OPNFV)是 Linux 基金会项目,它用于企业和服务提供商网络的 NFV 平台。它汇集了计算、存储和网络虚拟化方面的上游组件以创建 NFV 程序的端到端平台。

OPNFV 在 Bitergia 上的地址

要了解更多关于开源云计算趋势和查看顶级开源云计算项目完整列表,请下载 Linux 基金会的 “开放云指南”


via: https://www.linux.com/news/open-cloud-report/2016/5-open-source-software-defined-networking-projects-know

作者:SAM DEAN 译者:geekpi 校对:jasminepeng

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

最近关于 Linus Torvalds 的一个采访中,这位 Linux 的创始人,在采访过程中大约 14:20 的时候,提及了关于代码的 “good taste”。good taste?采访者请他展示更多的细节,于是,Linus Torvalds 展示了一张提前准备好的插图。

他展示的是一个代码片段。但这段代码并没有 “good taste”。这是一个具有 “poor taste” 的代码片段,把它作为例子,以提供一些初步的比较。

Poor Taste Code Example

这是一个用 C 写的函数,作用是删除链表中的一个对象,它包含有 10 行代码。

他把注意力集中在底部的 if 语句。正是这个 if 语句受到他的批判。

我暂停了这段视频,开始研究幻灯片。我发现我最近有写过和这很像的代码。Linus 不就是在说我的代码品味很差吗?我放下自傲,继续观看视频。

随后, Linus 向观众解释,正如我们所知道的,当从链表中删除一个对象时,需要考虑两种可能的情况。当所需删除的对象位于链表的表头时,删除过程和位于链表中间的情况不同。这就是这个 if 语句具有 “poor taste” 的原因。

但既然他承认考虑这两种不同的情况是必要的,那为什么像上面那样写如此糟糕呢?

接下来,他又向观众展示了第二张幻灯片。这个幻灯片展示的是实现同样功能的一个函数,但这段代码具有 “goog taste” 。

Good Taste Code Example

原先的 10 行代码现在减少为 4 行。

但代码的行数并不重要,关键是 if 语句,它不见了,因为不再需要了。代码已经被重构,所以,不用管对象在列表中的位置,都可以运用同样的操作把它删除。

Linus 解释了一下新的代码,它消除了边缘情况,就是这样。然后采访转入了下一个话题。

我琢磨了一会这段代码。 Linus 是对的,的确,第二个函数更好。如果这是一个确定代码具有 “good taste” 还是 “bad taste” 的测试,那么很遗憾,我失败了。我从未想到过有可能能够去除条件语句。我写过不止一次这样的 if 语句,因为我经常使用链表。

这个例子的意义,不仅仅是教给了我们一个从链表中删除对象的更好方法,而是启发了我们去思考自己写的代码。你通过程序实现的一个简单算法,可能还有改进的空间,只是你从来没有考虑过。

以这种方式,我回去审查最近正在做的项目的代码。也许是一个巧合,刚好也是用 C 写的。

我尽最大的能力去审查代码,“good taste” 的一个基本要求是关于边缘情况的消除方法,通常我们会使用条件语句来消除边缘情况。你的测试使用的条件语句越少,你的代码就会有更好的 “taste” 。

下面,我将分享一个通过审查代码进行了改进的一个特殊例子。

这是一个关于初始化网格边缘的算法。

下面所写的是一个用来初始化网格边缘的算法,网格 grid 以一个二维数组表示:grid行 。

再次说明,这段代码的目的只是用来初始化位于 grid 边缘的点的值,所以,只需要给最上方一行、最下方一行、最左边一列以及最右边一列赋值即可。

为了完成这件事,我通过循环遍历 grid 中的每一个点,然后使用条件语句来测试该点是否位于边缘。代码看起来就是下面这样:

for (r = 0; r < GRID_SIZE; ++r) {
    for (c = 0; c < GRID_SIZE; ++c) {
        // Top Edge
        if (r == 0)
            grid[r][c] = 0;
        // Left Edge
        if (c == 0)
            grid[r][c] = 0;
        // Right Edge
        if (c == GRID_SIZE - 1)
            grid[r][c] = 0;
        // Bottom Edge
        if (r == GRID_SIZE - 1)
            grid[r][c] = 0;
    }
}

虽然这样做是对的,但回过头来看,这个结构存在一些问题。

  1. 复杂性 — 在双层循环里面使用 4 个条件语句似乎过于复杂。
  2. 高效性 — 假设 GRID_SIZE 的值为 64,那么这个循环需要执行 4096 次,但需要进行赋值的只有位于边缘的 256 个点。

用 Linus 的眼光来看,将会认为这段代码没有 “good taste” 。

所以,我对上面的问题进行了一下思考。经过一番思考,我把复杂度减少为包含四个条件语句的单层 for 循环。虽然只是稍微改进了一下复杂性,但在性能上也有了极大的提高,因为它只是沿着边缘的点进行了 256 次循环。

for (i = 0; i < GRID_SIZE * 4; ++i) {
    // Top Edge
    if (i < GRID_SIZE)
        grid[0][i] = 0;
    // Right Edge
    else if (i < GRID_SIZE * 2)
        grid[i - GRID_SIZE][GRID_SIZE - 1] = 0;
    // Left Edge
    else if (i < GRID_SIZE * 3)
        grid[i - (GRID_SIZE * 2)][0] = 0;
    // Bottom Edge
    else
        grid[GRID_SIZE - 1][i - (GRID_SIZE * 3)] = 0;
}

的确是一个很大的提高。但是它看起来很丑,并不是易于阅读理解的代码。基于这一点,我并不满意。

我继续思考,是否可以进一步改进呢?事实上,答案是 YES!最后,我想出了一个非常简单且优雅的算法,老实说,我不敢相信我会花了那么长时间才发现这个算法。

下面是这段代码的最后版本。它只有一层 for 循环并且没有条件语句。另外。循环只执行了 64 次迭代,极大的改善了复杂性和高效性。

for (i = 0; i < GRID_SIZE; ++i) {
    // Top Edge
    grid[0][i] = 0;

    // Bottom Edge
    grid[GRID_SIZE - 1][i] = 0;
    // Left Edge
    grid[i][0] = 0;
    // Right Edge
    grid[i][GRID_SIZE - 1] = 0;
}

这段代码通过每次循环迭代来初始化四条边缘上的点。它并不复杂,而且非常高效,易于阅读。和原始的版本,甚至是第二个版本相比,都有天壤之别。

至此,我已经非常满意了。

那么,我是一个有 “good taste” 的开发者么?

我觉得我是,但是这并不是因为我上面提供的这个例子,也不是因为我在这篇文章中没有提到的其它代码……而是因为具有 “good taste” 的编码工作远非一段代码所能代表。Linus 自己也说他所提供的这段代码不足以表达他的观点。

我明白 Linus 的意思,也明白那些具有 “good taste” 的程序员虽各有不同,但是他们都是会将他们之前开发的代码花费时间重构的人。他们明确界定了所开发的组件的边界,以及是如何与其它组件之间的交互。他们试着确保每一样工作都完美、优雅。

其结果就是类似于 Linus 的 “good taste” 的例子,或者像我的例子一样,不过是千千万万个 “good taste”。

你会让你的下个项目也具有这种 “good taste” 吗?


via: https://medium.com/@bartobri/applying-the-linus-tarvolds-good-taste-coding-requirement-99749f37684a

作者:Brian Barto 译者:ucasFL 校对:wxy

本文由 LCTT 组织编译,Linux中国 荣誉推出

Arduino Project

  • 刚刚完成我的第一个 Arduino 项目:一个闪烁的 LED
  • 下一步:更新我的 LinkedIn 详情
  • 添加技能:机电工程师

这篇漫画讽刺的是一些人只是接触了某个领域的很浅显的知识,就急急忙忙的为自己加上相应的头衔,却没有考虑自己所掌握的东西,在整个领域内所处的位置。


via: https://turnoff.us/geek/arduino-project/

作者:Daniel Stori 译者&点评:Bestony 校对:wxy 合成:GHLandy

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