2021年10月

Debian 和基于 Debian 的 Kali Linux 将 Firefox 作为默认的网页浏览器。但这并不意味着你不能在其中安装其他网页浏览器。

Chrome 浏览器非常流行,你可能已经在其他系统上使用它了。如果你想在 Debian 上安装 Chrome,你肯定可以这样做。

你在 Debian 的软件库中找不到 Chrome,因为它不是开源软件,但你可以从 Chrome 网站下载并安装它。

在本教程中,我将向你展示在 Debian 上安装 Chrome 的两种方法:

  • GUI 方法
  • 命令行方法

让我们先从 GUI 方法开始。

注意:我在这里的例子中使用的是 Debian,但由于 Kali Linux 是基于 Debian 的,所以同样的方法也适用于 Kali Linux。

方法 1: 在 Debian 上以图形方式安装 Chrome 浏览器

这是一个不费吹灰之力的方法。你去 Chrome 网站,下载 deb 文件,然后双击它来安装它。我将详细地展示这些步骤,这样你就能很容易地掌握了。

前往 Chrome 的网站。

Get Google Chrome

你会看到下载 Chrome 的选项。

Click on the Download Chrome button

当你点击下载按钮时,它会给你两个下载安装文件的选项。选择写着 Debian/Ubuntu 的那个。

Download the Chrome installer file for Debian

请注意,Chrome 浏览器不适用于 32 位系统。

接下来,你应该选择将文件保存到电脑中,而不是在软件中心打开进行安装。这样一来,下载的文件将被保存在下载文件夹中,而不是临时目录中。

Save the downloaded DEB file for Google Chrome

进入下载文件夹,右击下载的 DEB 文件,选择用 “Software Install” 打开它。

Right click on the downloaded DEB file and open with Software Install

它将打开软件中心,你应该看到现在安装 Chrome 浏览器的选项。点击安装按钮。

Click on the install button

你会被要求输入账户的密码。这是你用来登录系统的同一密码。

Enter your account’s password

在不到一分钟的时间里,Chrome 就会安装完毕。你现在应该看到一个删除选项,这表明软件已经安装完毕。

Chrome is now installed

当 Chrome 在 Debian 上安装完毕,在系统菜单中搜索它并启动它。

Start Google Chrome

它将要求成为你的默认浏览器,并将崩溃报告发送给谷歌。你可以取消勾选这两个选项。然后你就可以看到谷歌浏览器的窗口。

如果你登录了你的谷歌账户,你应该可以在这里同步你的密码、书签和其他浏览数据。好好体验吧!

还有一点,安装完 Chrome 后,你可以从系统中删除下载的 DEB 文件。不再需要它了,甚至在卸载 Chrome 时也不需要。

方法 2:在 Debian 上从终端安装 Chrome

你刚才看到的内容可以在终端中轻松实现。

首先,确保你的软件包缓存已经刷新,并且你已经安装了 wget,用于 在终端中从网上下载文件

sudo apt update && sudo apt install wget

接下来是下载 Chrome 的 .deb 文件。

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

下载后,你可以用 apt 命令 在终端安装 deb 文件,像这样:

sudo apt install ./google-chrome-stable_current_amd64.deb

安装完成后,你就可以开始使用 Chrome 了。

额外提示:更新 Chrome

这两种方法都会将谷歌的软件库添加到你的系统中。你可以在你的 sources.list.d 目录中看到它:

cat /etc/apt/sources.list.d/google-chrome.list

这意味着 Chrome 将与 Debian 和 Kali Linux 中的其他系统更新一起被更新。你知道 如何在命令行中更新你的 Kali Linux 或 Debian 系统么?只要使用这个命令:

sudo apt update && sudo apt upgrade -y

从你的系统中卸载 Chrome

即使你选择用 GUI 方法在 Debian 上安装 Chrome,你也必须使用终端来删除它。

不要担心。这其实只是一个命令:

sudo apt purge google-chrome-stable

根据要求输入你的账户密码。当你输入密码时,屏幕上没有任何显示。这没关系。输入它并按回车键,确认删除。

好了,就这些了。我希望你觉得这个教程有帮助。


via: https://itsfoss.com/install-chrome-debian-kali-linux/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

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

增强 C 语言程序的弹性和可靠性的五种方法。

 title=

即使是最好的程序员也无法完全避免错误。这些错误可能会引入安全漏洞、导致程序崩溃或产生意外操作,具体影响要取决于程序的运行逻辑。

C 语言有时名声不太好,因为它不像近期的编程语言(比如 Rust)那样具有内存安全性。但是通过额外的代码,一些最常见和严重的 C 语言错误是可以避免的。下文讲解了可能影响应用程序的五个错误以及避免它们的方法:

1、未初始化的变量

程序启动时,系统会为其分配一块内存以供存储数据。这意味着程序启动时,变量将获得内存中的一个随机值。

有些编程环境会在程序启动时特意将内存“清零”,因此每个变量都得以有初始的零值。程序中的变量都以零值作为初始值,听上去是很不错的。但是在 C 编程规范中,系统并不会初始化变量。

看一下这个使用了若干变量和两个数组的示例程序:

#include <stdio.h>
#include <stdlib.h>

int
main()
{
  int i, j, k;
  int numbers[5];
  int *array;

  puts("These variables are not initialized:");

  printf("  i = %d\n", i);
  printf("  j = %d\n", j);
  printf("  k = %d\n", k);

  puts("This array is not initialized:");

  for (i = 0; i < 5; i++) {
    printf("  numbers[%d] = %d\n", i, numbers[i]);
  }

  puts("malloc an array ...");
  array = malloc(sizeof(int) * 5);

  if (array) {
    puts("This malloc'ed array is not initialized:");

    for (i = 0; i < 5; i++) {
      printf("  array[%d] = %d\n", i, array[i]);
    }

    free(array);
  }

  /* done */

  puts("Ok");
  return 0;
}

这个程序不会初始化变量,所以变量以系统内存中的随机值作为初始值。在我的 Linux 系统上编译和运行这个程序,会看到一些变量恰巧有“零”值,但其他变量并没有:

These variables are not initialized:
  i = 0
  j = 0
  k = 32766
This array is not initialized:
  numbers[0] = 0
  numbers[1] = 0
  numbers[2] = 4199024
  numbers[3] = 0
  numbers[4] = 0
malloc an array ...
This malloc'ed array is not initialized:
  array[0] = 0
  array[1] = 0
  array[2] = 0
  array[3] = 0
  array[4] = 0
Ok

很幸运,ij 变量是从零值开始的,但 k 的起始值为 32766。在 numbers 数组中,大多数元素也恰好从零值开始,只有第三个元素的初始值为 4199024。

在不同的系统上编译相同的程序,可以进一步显示未初始化变量的危险性。不要误以为“全世界都在运行 Linux”,你的程序很可能某天在其他平台上运行。例如,下面是在 FreeDOS 上运行相同程序的结果:

These variables are not initialized:
  i = 0
  j = 1074
  k = 3120
This array is not initialized:
  numbers[0] = 3106
  numbers[1] = 1224
  numbers[2] = 784
  numbers[3] = 2926
  numbers[4] = 1224
malloc an array ...
This malloc'ed array is not initialized:
  array[0] = 3136
  array[1] = 3136
  array[2] = 14499
  array[3] = -5886
  array[4] = 219
Ok

永远都要记得初始化程序的变量。如果你想让变量将以零值作为初始值,请额外添加代码将零分配给该变量。预先编好这些额外的代码,这会有助于减少日后让人头疼的调试过程。

2、数组越界

C 语言中,数组索引从零开始。这意味着对于长度为 10 的数组,索引是从 0 到 9;长度为 1000 的数组,索引则是从 0 到 999。

程序员有时会忘记这一点,他们从索引 1 开始引用数组,产生了 “大小差一” off by one 错误。在长度为 5 的数组中,程序员在索引“5”处使用的值,实际上并不是数组的第 5 个元素。相反,它是内存中的一些其他值,根本与此数组无关。

这是一个数组越界的示例程序。该程序使用了一个只含有 5 个元素的数组,但却引用了该范围之外的数组元素:

#include <stdio.h>
#include <stdlib.h>

int
main()
{
  int i;
  int numbers[5];
  int *array;

  /* test 1 */

  puts("This array has five elements (0 to 4)");

  /* initalize the array */
  for (i = 0; i < 5; i++) {
    numbers[i] = i;
  }

  /* oops, this goes beyond the array bounds: */
  for (i = 0; i < 10; i++) {
    printf("  numbers[%d] = %d\n", i, numbers[i]);
  }

  /* test 2 */

  puts("malloc an array ...");

  array = malloc(sizeof(int) * 5);

  if (array) {
    puts("This malloc'ed array also has five elements (0 to 4)");

    /* initalize the array */
    for (i = 0; i < 5; i++) {
      array[i] = i;
    }

    /* oops, this goes beyond the array bounds: */
    for (i = 0; i < 10; i++) {
      printf("  array[%d] = %d\n", i, array[i]);
    }

    free(array);
  }

  /* done */

  puts("Ok");
  return 0;
}

可以看到,程序初始化了数组的所有值(从索引 0 到 4),然后从索引 0 开始读取,结尾是索引 9 而不是索引 4。前五个值是正确的,再后面的值会让你不知所以:

This array has five elements (0 to 4)
  numbers[0] = 0
  numbers[1] = 1
  numbers[2] = 2
  numbers[3] = 3
  numbers[4] = 4
  numbers[5] = 0
  numbers[6] = 4198512
  numbers[7] = 0
  numbers[8] = 1326609712
  numbers[9] = 32764
malloc an array ...
This malloc'ed array also has five elements (0 to 4)
  array[0] = 0
  array[1] = 1
  array[2] = 2
  array[3] = 3
  array[4] = 4
  array[5] = 0
  array[6] = 133441
  array[7] = 0
  array[8] = 0
  array[9] = 0
Ok

引用数组时,始终要记得追踪数组大小。将数组大小存储在变量中;不要对数组大小进行 硬编码 hard-code 。否则,如果后期该标识符指向另一个不同大小的数组,却忘记更改硬编码的数组长度时,程序就可能会发生数组越界。

3、字符串溢出

字符串只是特定类型的数组。在 C 语言中,字符串是一个由 char 类型值组成的数组,其中用一个零字符表示字符串的结尾。

因此,与数组一样,要注意避免超出字符串的范围。有时也称之为 字符串溢出

使用 gets 函数读取数据是一种很容易发生字符串溢出的行为方式。gets 函数非常危险,因为它不知道在一个字符串中可以存储多少数据,只会机械地从用户那里读取数据。如果用户输入像 foo 这样的短字符串,不会发生意外;但是当用户输入的值超过字符串长度时,后果可能是灾难性的。

下面是一个使用 gets 函数读取城市名称的示例程序。在这个程序中,我还添加了一些未使用的变量,来展示字符串溢出对其他数据的影响:

#include <stdio.h>
#include <string.h>

int
main()
{
  char name[10];                       /* Such as "Chicago" */
  int var1 = 1, var2 = 2;

  /* show initial values */

  printf("var1 = %d; var2 = %d\n", var1, var2);

  /* this is bad .. please don't use gets */

  puts("Where do you live?");
  gets(name);

  /* show ending values */

  printf("<%s> is length %d\n", name, strlen(name));
  printf("var1 = %d; var2 = %d\n", var1, var2);

  /* done */

  puts("Ok");
  return 0;
}

当你测试类似的短城市名称时,该程序运行良好,例如伊利诺伊州的 Chicago 或北卡罗来纳州的Raleigh

var1 = 1; var2 = 2
Where do you live?
Raleigh
<Raleigh> is length 7
var1 = 1; var2 = 2
Ok

威尔士的小镇 Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch 有着世界上最长的名字之一。这个字符串有 58 个字符,远远超出了 name 变量中保留的 10 个字符。结果,程序将值存储在内存的其他区域,覆盖了 var1var2 的值:

var1 = 1; var2 = 2
Where do you live?
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
<Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch> is length 58
var1 = 2036821625; var2 = 2003266668
Ok
Segmentation fault (core dumped)

在运行结束之前,程序会用长字符串覆盖内存的其他部分区域。注意,var1var2 的值不再是起始的 12

避免使用 gets 函数,改用更安全的方法来读取用户数据。例如,getline 函数会分配足够的内存来存储用户输入,因此不会因输入长值而发生意外的字符串溢出。

4、重复释放内存

“分配的内存要手动释放”是良好的 C 语言编程原则之一。程序可以使用 malloc 函数为数组和字符串分配内存,该函数会开辟一块内存,并返回一个指向内存中起始地址的指针。之后,程序可以使用 free 函数释放内存,该函数会使用指针将内存标记为未使用。

但是,你应该只使用一次 free 函数。第二次调用 free 会导致意外的后果,可能会毁掉你的程序。下面是一个针对此点的简短示例程序。程序分配了内存,然后立即释放了它。但为了模仿一个健忘但有条理的程序员,我在程序结束时又一次释放了内存,导致两次释放了相同的内存:

#include <stdio.h>
#include <stdlib.h>

int
main()
{
  int *array;

  puts("malloc an array ...");

  array = malloc(sizeof(int) * 5);

  if (array) {
    puts("malloc succeeded");

    puts("Free the array...");
    free(array);
  }

  puts("Free the array...");
  free(array);

  puts("Ok");
}

运行这个程序会导致第二次使用 free 函数时出现戏剧性的失败:

malloc an array ...
malloc succeeded
Free the array...
Free the array...
free(): double free detected in tcache 2
Aborted (core dumped)

要记得避免在数组或字符串上多次调用 free。将 mallocfree 函数定位在同一个函数中,这是避免重复释放内存的一种方法。

例如,一个纸牌游戏程序可能会在主函数中为一副牌分配内存,然后在其他函数中使用这副牌来玩游戏。记得在主函数,而不是其他函数中释放内存。将 mallocfree 语句放在一起有助于避免多次释放内存。

5、使用无效的文件指针

文件是一种便捷的数据存储方式。例如,你可以将程序的配置数据存储在 config.dat 文件中。Bash shell 会从用户家目录中的 .bash_profile 读取初始化脚本。GNU Emacs 编辑器会寻找文件 .emacs 以从中确定起始值。而 Zoom 会议客户端使用 zoomus.conf 文件读取其程序配置。

所以,从文件中读取数据的能力几乎对所有程序都很重要。但是假如要读取的文件不存在,会发生什么呢?

在 C 语言中读取文件,首先要用 fopen 函数打开文件,该函数会返回指向文件的流指针。你可以结合其他函数,使用这个指针来读取数据,例如 fgetc 会逐个字符地读取文件。

如果要读取的文件不存在或程序没有读取权限,fopen 函数会返回 NULL 作为文件指针,这表示文件指针无效。但是这里有一个示例程序,它机械地直接去读取文件,不检查 fopen 是否返回了 NULL

#include <stdio.h>

int
main()
{
  FILE *pfile;
  int ch;

  puts("Open the FILE.TXT file ...");

  pfile = fopen("FILE.TXT", "r");

  /* you should check if the file pointer is valid, but we skipped that */

  puts("Now display the contents of FILE.TXT ...");

  while ((ch = fgetc(pfile)) != EOF) {
    printf("<%c>", ch);
  }

  fclose(pfile);

  /* done */

  puts("Ok");
  return 0;
}

当你运行这个程序时,第一次调用 fgetc 会失败,程序会立即中止:

Open the FILE.TXT file ...
Now display the contents of FILE.TXT ...
Segmentation fault (core dumped)

始终检查文件指针以确保其有效。例如,在调用 fopen 打开一个文件后,用类似 if (pfile != NULL) 的语句检查指针,以确保指针是可以使用的。

人都会犯错,最优秀的程序员也会产生编程错误。但是,遵循上面这些准则,添加一些额外的代码来检查这五种类型的错误,就可以避免最严重的 C 语言编程错误。提前编写几行代码来捕获这些错误,可能会帮你节省数小时的调试时间。


via: https://opensource.com/article/21/10/programming-bugs

作者:Jim Hall 选题:lujun9972 译者:unigeorge 校对:wxy

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

Pine64 宣布最新的 Linux 手机 PinePhone Pro

PinePhone Pro 说是手机有些不确切,从某种意义上来说,它也是一部电脑,是一部运行 Manjaro Linux 的电脑。把它插入显示器,它就是一台低功耗电脑。它所使用的 KDE Plasma Mobile 可以自适应这种手机显示和桌面显示切换的情况。它的主频为 1.5GHz,4GB 内存,128GB 存储。有一个 1300 万像素的主摄像头传感器和一个 500 万像素的前置摄像头,以及一个 6 英寸的 1440 x 720 的 IPS 触摸屏。此外,最重要的是,它提供了绝大多数手机缺少的功能,即硬件的隐私开关,这些藏在后盖的硬件开关可以关闭摄像头、麦克风、Wi-Fi、蓝牙、耳机插孔和 LTE 调制解调器(包括 GPS)等等。最后,它的价格是 399 美元,现在开发者版预定中。

老王点评:真是有点心动啊。

Python 的多线程速度可能大幅提高

Python 长期以来有一个弱点,它无法在多线程环境中很好地扩展。开发者提议 对全局解释器锁(GIL)进行重大修改,重写 Python 在其运行时从多个线程对对象进行序列化访问的方式,将大大提升多线程的性能。这一变化的整体效果略微提高了 10% 的单线程性能。但在多线程情况下,每一个新的线程 几乎是线性扩展的,例如,当使用 20 个线程时,基准测试中加速了 18.1 - 19.8 倍。

老王点评:要是多线程的性能能解决,那就真是一大胜利了。

佳能被控在打印机缺墨时人为禁用扫描和传真功能

佳能美国公司现在面临着一起 集体诉讼,指控称,“尽管该打印机被宣传为具有三种不同的功能 —— 打印、复印和扫描,但却都没有警告说所有这些功能都需要墨水。因为在扫描时没有对墨水的实际需要,佳能这样做只是为了增加利润,因此该公司是在进行不当得利的行为。”目前该诉讼还没有被批准为集体诉讼,但如果它被批准并胜诉,任何佳能打印机的买家都可能获得赔偿。

老王点评:凭啥没墨你就不让扫描?

开源以丰富的项目画布引领着处理实时事件的方向。

 title=

在“永不下线”的未来,入网设备规模可能会达到数十亿。存储原始数据,日后再进行分析的方案将不再能满足需求,因为用户需要实时且准确的响应。要对故障等对环境敏感的状况进行预测,实时处理数据也必不可少 —— 数据到达数据库后再处理肯定是来不及的。

有人可能会说,“云可扩展性”能够满足实时处理流数据的需求,但一些简单的例子就能表明它永远无法满足对无界数据流进行实时响应的需求。从移动设备到物联网,都需要一种新的范式来满足需求。尽管云计算依赖于对大数据“先存储后分析”的方案,但也迫切需要一种能够处理持续、杂乱和海量数据流的软件框架,并在数据流到达时立即对其进行处理,以保证实时的响应、预测和对数据的洞悉。

例如,在加利福尼亚州的帕洛阿尔托市,每天从基础交通设施产生的流数据比 Twitter Firehose 还要多。这是很大的数据量。为 Uber、Lyft 和 FedEx 等消费者预测城市交通需要实时的分析、学习和预测。云处理不可避免地导致每个事件大约会有半秒的延迟。

我们需要一个简单而强大的编程范式,让应用程序在类似下面的情况时能够动态处理无界数据流:

  • 数据量巨大,或原始数据的移动成本很高。
  • 数据由广泛分布的资产(例如移动设备)生成。
  • 数据具有转瞬即逝的价值,即时分析迫在眉睫。
  • 需要始终洞悉最新数据情况,外推法行不通。

发布和订阅

事件驱动系统领域中有一个关键架构模式: 发布/订阅 publish/subscribe 消息传递模式。这是一种异步通信方法,其中消息会从 发布者(数据产生方)传递到 订阅者(处理数据的应用程序)。发布/订阅模式可以将消息发送者与消费者分离开来。

在发布/订阅模式中,消息源会 发布 针对某个 主题 topic 事件 event 服务端 broker ,后者按接收顺序存储它们。应用程序可以 订阅 一个或多个 主题,然后 服务端 会转发匹配的事件。 Apache Kafka 和 Pulsar 以及 CNCF NATS 是发布/订阅系统。 发布/订阅的云服务包括 Google Pub/Sub、AWS Kinesis、Azure Service Bus、Confluent Cloud 等。(LCTT 译注:本段部分术语英文名称更为泛用,针对这些术语,采用了中英文标注。)

发布/订阅系统不会 运行 订阅者应用程序,它们只是 传递 数据给相应主题的订阅者。

流数据通常包含应用程序或基础架构状态更新的事件。在选择架构来处理数据时,发布/订阅框架等数据分发系统的作用是有限的。消费者应用程序的“处理方式”超出了发布/订阅系统的范围。这让开发人员的管理变得极具复杂性。所谓的流处理器是一种特殊的订阅者,可以动态分析数据并将结果返回给同一个服务端。

Apache Spark

Apache Spark 是用于大规模数据处理的统一分析引擎。通常将 Apache Spark Streaming 用作流处理器,例如给机器学习模型提供新数据。Spark Streaming 将数据分成小批量,每个小批量都由 Spark 模型或其他系统独立分析。事件流可以被分组成小批量以进行分析,但流处理器本身必须具有弹性:

  • 流处理器必须能够根据数据速率进行扩展,甚至要能够跨越服务器和云,并且还可以跨实例实现负载均衡,以确保弹性和其他应用层的需求。
  • 它必须能够分析来自不同来源的数据,这些数据源的报告速率可能相差很大。这意味着它必须是有状态的,或者将状态存储在数据库中。当使用 Spark Streaming 作为流处理器时,通常会使用后一种方法,这种方法在需要超低延迟响应时可能会存在性能问题。

相关项目 Apache Samza 也提供了一种处理实时事件流的方法,并使用 Hadoop YarnApache Mesos 来管理计算资源,以便进行弹性扩展。

解决数据扩展问题

需要注意的是,即使是 Samza 也不能完全减轻开发人员的数据处理需求。扩展数据规模意味着处理事件的任务需要跨多个实例进行负载均衡,而使用数据库是实例间共享结果应用层状态的唯一方法。然而,当应用程序任务之间的状态协调转移到数据库时,对性能会产生不可避免的连锁反应。此外,数据库的选择也至关重要。随着系统的扩展,数据库的集群管理会成为下一个潜在的瓶颈。

这个问题可以通过有状态、有弹性的替代方案来解决,并且这样的解决方案可以用来代替流处理器。在应用程序级别(容器或实例内),这些解决方案依据流的更新,动态构建并发、互连的“web 代理”的有状态模型。代理是并发的“微服务”,它们消费单一来源的原始数据并维护它们的状态。基于数据中发现的源之间的真实关系(如包含和临近),代理实现互连以共享状态。代理也因此形成了一个并发服务图,可以分析它们自己的状态和链接到的代理的状态。数据源将原始数据转换为状态,并根据自身及其链接子图的变化进行分析、学习和预测,每个代理都为单个这样的数据源提供微服务。

这些解决方案允许大量的代理(真实数据源的数字类比)分布,甚至还有在应用层使代理互连的分布式图,从而简化了应用架构。这是因为代理之间互连的本质,是映射到解决方案的当前运行时执行实例和代理本身的 URL。通过这种方式,应用程序可以跨实例无缝扩展,而无需担心 DevOps 问题。代理消费数据并维护状态,还会计算自己和其他代理的状态。由于代理是有状态的,因此不需要数据库,并且数据洞察是以内存速度计算的。

使用开源阅读数据世界

我们查看数据的方式正在发生翻天覆地的变化:不再将数据库用作记录系统,取而代之的是现实世界,现实世界事物的数字类比可以不断地传输它们的状态。幸运的是,开源社区在处理实时事件的项目丰富度方面处于领先地位。从发布/订阅模式(其中最活跃的社区是 Apache Kafka、Pulsar 和 CNCF NATS)到持续处理流数据的分析框架,包括 Apache Spark、FlinkBeam、Samza,以及 Apache 许可的 SwimOSHazelcast,对开发人员来说,可选择项目非常之多。可以说,没有什么地方比开源社区的专有软件框架更多了。试看软件的未来,必是开源的天下。


via: https://opensource.com/article/20/2/real-time-data-processing

作者:Simon Crosby 选题:lujun9972 译者:unigeorge 校对:wxy

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

Linux 本来会像其他业余项目一样被抛在后面,但开源改变了这一点。

你可能已经知道这个故事,30 年前,芬兰学生 Linus Torvalds 开发了一个业余项目,创建了一个类 UNIX 操作系统。

你不知道的是,Torvalds 认为这个业余项目已经完成了,他本想把它抛在脑后,做一些新的、有趣的项目。

那么,是什么让他在这个“业余项目”上工作了 30 年呢?答案是开源。

开源改变了 Linux

在最近结束的 北美开源峰会 上,Linus Torvalds 分享了一些关于 Linux 项目过去、现在和未来的见解。

当回忆起这个项目的最初情况时,Torvalds 说 他本以为会以“已完成的状态”抛下 Linux 这个项目,而去做些新的、有趣的事情。

显然是开源改变了这一切。这个项目,如果是由我来决定,我可能会把它抛在一边,但是突然间,我开始收到各种问题,最后还有人们提交的补丁,这使得我的动力不断持续。现在 30 年过去了,这仍然是动力所在。

Torvalds 还补充说,就他而言,Linux 在过去 29 年里已经完成了。以后添加的每一个其他的功能,都是其他人需要、想要或感兴趣的。

许多开发人员都会遇到这种情况。你在一个项目上工作,认为它已经达到“完成”的状态了,如果这个项目没有足够的吸引力,你就会对它失去兴趣,转而去做一些“新的、有趣的”事情。实际上继续这个项目的真正动力来自用户和认可。

当被问及 Linux 50 周年要做些什么时,Torvalds 说,他不认为自己在 70 岁的时候还能继续做内核编程。然后他还补充说,他也没想过自己在 50 岁还在做内核编程,但他现在却在做这个事情。

“不知何故,我不认为我 70 岁还能做内核编程。但是另一方面,几年前,我也没想到自己 50 岁还在做内核编程,所以……我们拭目以待。”

我们总是愿意听 Torvalds 谈论 Linux,作为一个热心的 Linux 用户,我们还有如此多需要学习和交流的东西!

来源:The News Stack


via: https://news.itsfoss.com/open-source-changed-linux-torvalds/

作者:Abhishek 选题:lujun9972 译者:zd200572 校对:wxy

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

机器狗正在安装枪支

四足机器狗是近年来机器人技术中最有趣的发展之一。它们体积小,动作灵活,能够穿越那些令轮式机器沮丧的环境。在 一篇报道的图片中 显示了一个四足机器人配备了一把无人步枪。这把枪被设计成可以安装在各种机器人平台上,有 30 倍的光学变焦,热像仪可在黑暗中瞄准目标,有效射程为 1200 米。开发这把枪的公司称,“SWORD 防御系统 SPUR 是无人驾驶武器系统的未来,而这个未来就是现在。”

老王点评:令人不寒而栗!

今年又有三起针对水处理厂的勒索软件攻击事件

美国政府发表的 一份报告中说,今年勒索软件团伙已经悄悄地袭击了三个美国水和废水处理设施。这些攻击以前没有报道过,它们发生在 3 月、7 月和 8 月,分别袭击了内华达州、缅因州和加利福尼亚州的设施。这些攻击导致威胁者对文件进行加密和控制了工业计算机。

老王点评:不像已经习惯了加强防御的互联网机构,传统的基础设施企业往往在面对来自互联网的侵袭有些麻痹。

90% 的英国企业在使用开源技术

在一份 OpenUK 对开源软件对英国经济影响的 调查报告 中称,89% 的英国公司正在使用开源技术。这份针对英国的报告还透露,英国是欧洲开源软件的最大贡献者,也是全球第五大贡献者。开源软件每年为英国的国内生产总值贡献 431.5 亿英镑,并在 2020 年为英国企业带来约 465 亿英镑的“潜在价值”。这些报告是基于 2021 年 5 月至 6 月在英国对 273 家企业的调查。

老王点评:虽然说对开源的认识有种种不同,但是开源已经深入到方方面面,发挥的作用也可能比我们意识到的更大更广。