2022年6月

GitHub 正式宣布终止 Atom 项目

GitHub 是在 2011 年宣布 Atom,2015 年 5 月发布了 1.0 版本,并吸引了数百万开发者使用。而微软在 2015 年推出的 VS Code 也是受到了 Atom 的启发。在 2018 年微软收购 GitHub 后,Atom 成为了微软的项目。在社区对 Atom 前景的担忧之下,GitHub 承诺不会放弃 Atom。但过去几年 Atom 除了安全更新外几乎没有什么改进。而 Atom 和 VS Code 的用户数此消彼长,Stack Overflow 的 2021 年度开发者调查结果表明,仅 13% 开发者将 Atom 当做主力开发环境,而 VS Code 却高达 71%。最后,Atom 还留下了一个重要遗产,它所分拆出来的 Electron 框架被数以千计的应用广泛使用,其中包括 VS Code、Slack 和 GitHub Desktop 等等。

消息来源:GitHub
老王点评:其实可以想到,当年社区对 GitHub 被收购的担忧并非无的放矢。可惜了 Atom,至今我还对 Atom 1.0 那时候的那个 宣传视频 记忆尤深。

IETF 正式颁布 HTTP/3 推荐标准 RFC 9114

作为超文本传输协议的第三个大版本,它确定了 QUIC 包含的 HTTP/2 功能,并描述了如何将 HTTP/2 扩展迁移至 HTTP/3。QUIC 全称为“快速 UDP 互联网连接”,由谷歌创建并于 2013 年发布。其旨在化解 TCP 需要多次来回握手,才能建立连接并开始传输数据的短板。早在 IETF 颁布 HTTP/3 的意见征求稿前,谷歌就已经将 QUIC 支持内嵌于 Chrome 浏览器,并在谷歌的诸多服务上启用。Web 流量观测表明 HTTP/3 的流量已超过 HTTP/1.1。

消息来源:The Register
老王点评:我记得 HTTP/2 也不过才几年,现在都要开始普及 HTTP/3。真是风水轮流转,谁想到最主要的互联网应用 HTTP 最终会从 TCP 转向 UDP 呢。

谷歌再次打破圆周率计算纪录,计算出百万亿位

早在 2019 年,谷歌云服务就已经打破了圆周率的计算纪录,计算出了 31.4 万亿位。周三,谷歌云再次宣布打破了百万亿位的圆周率计算纪录。这 百万亿位圆周率 的最后 10 位是:30952 95560。谷歌云表示,其借助计算引擎服务完成了本次新挑战,用到了 N2 机器家族、虚拟网卡、100 Gbps 网络带宽,以及平衡持久磁盘等新功能。

消息来源:谷歌
老王点评:看似无用的圆周率计算,其实是谷歌云一次炫技的展示。有人说,任何大小的数字都能在圆周率的某个片段找到。不说百万亿位了,你能背出多少位圆周率呢?

编译软件在你如何运行你的系统方面给你很大的灵活性。LD_LIBRARY_PATH 变量,以及 GCC 的 -L-l 选项,是这种灵活性的组成部分。

编译软件是开发者经常做的事情,在开源世界中,一些用户甚至选择自己动手。Linux 播客 Dann Washko 称源码为“通用包格式”,因为它包含了使一个应用在任何平台上运行所需的所有组件。当然,并不是所有的源码都是为所有的系统编写的,所以它只是在目标系统的子集内是“通用”的,但问题是,源码是非常灵活的。有了开源,你可以决定代码的编译和运行方式。

当你在编译代码时,你通常要处理多个源文件。开发人员倾向于将不同的类或模块放在不同的文件中,这样它们可以被单独维护,甚至可能被不同的项目使用。但当你编译这些文件时,许多文件会被编译成一个可执行文件。

这通常是通过创建共享库来完成的,然后从可执行文件中动态链接回它们。这样可以通过保持模块化功能的外部性来保持可执行文件的小型化,并确保库可以独立于使用它们的应用而被更新。

在编译过程中定位一个共享对象

当你 用 GCC 编译 时,你通常需要在你的工作站上安装一个库,以便 GCC 能够定位到它。默认情况下,GCC 假定库在系统库路径中,例如 /lib64/usr/lib64。然而,如果你要链接到一个你自己的尚未安装的库,或者你需要链接到一个没有安装在标准位置的库,那么你必须帮助 GCC 找到这些文件。

有两个选项对于在 GCC 中寻找库很重要:

  • -L(大写字母 L)在 GCC 的搜索位置上增加一个额外的库路径。
  • -l(小写字母 L)设置你要链接的库的名字。

例如,假设你写了一个叫做 libexample.so 的库,并且你想在编译你的应用 demo.c 时使用它。首先,从 demo.c 创建一个对象文件:

$ gcc -I ./include -c src/demo.c

-I 选项在 GCC 搜索头文件的路径中增加了一个目录。在这个例子中,我假设自定义头文件在一个名为 include 的本地目录中。-c 选项防止 GCC 运行链接器,因为这个任务只是为了创建一个对象文件。结果如下:

$ ls
demo.o   include/   lib/    src/

现在你可以使用 -L 选项为你的库设置一个路径,然后进行编译:

$ gcc -L`pwd`/lib -o myDemo demo.o -lexample

注意,-L 选项在 -l 选项之前。这很重要,因为如果在你告诉 GCC 查找非默认库之前没有将 -L 添加到 GCC 的搜索路径中,GCC 就不知道要在你的自定义位置上搜索。编译成功了,但当你试图运行它时,却出现了问题:

$ ./myDemo
./myDemo: error while loading shared libraries:
libexample.so: cannot open shared object file:
No such file or directory

用 ldd 排除故障

ldd 工具可以打印出共享对象的依赖关系,它在排除类似问题时很有用:

$ ldd ./myDemo
        linux-vdso.so.1 (0x00007ffe151df000)
        libexample.so => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007f514b60a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f514b839000)

你已经知道定位不到 libexample,但 ldd 输出至少确认了它对工作库的期望位置。例如,libc.so.6已经被定位,ldd 显示其完整路径。

LD\_LIBRARY\_PATH

LD_LIBRARY_PATH 环境变量 定义了库的路径。如果你正在运行一个依赖于没有安装到标准目录的库的应用程,你可以使用 LD_LIBRARY_PATH 添加到系统的库搜索路径。

有几种设置环境变量的方法,但最灵活的是在运行命令前放置环境变量。看看设置 LD_LIBRARY_PATHldd 命令在分析一个“损坏”的可执行文件时的作用:

$ LD_LIBRARY_PATH=`pwd`/lib ldd ./
   linux-vdso.so.1 (0x00007ffe515bb000)
   libexample.so => /tmp/Demo/lib/libexample.so (0x0000...
   libc.so.6 => /lib64/libc.so.6 (0x00007eff037ee000)
   /lib64/ld-linux-x86-64.so.2 (0x00007eff03a22000)

这也同样适用于你的自定义命令:

$ LD_LIBRARY_PATH=`pwd`/lib myDemo
hello world!

然而,如果你移动库文件或可执行文件,它又会失效:

$ mv lib/libexample.so ~/.local/lib64
$ LD_LIBRARY_PATH=`pwd`/lib myDemo
./myDemo: error while loading shared libraries...

要修复它,你必须调整 LD_LIBRARY_PATH 以匹配库的新位置:

$ LD_LIBRARY_PATH=~/.local/lib64 myDemo
hello world!

何时使用 LD\_LIBRARY\_PATH

在大多数情况下,LD_LIBRARY_PATH 不是你需要设置的变量。按照设计,库安装到 /usr/lib64 中,因此应用自然会在其中搜索所需的库。在两种情况下,你可能需要使用 LD_LIBRARY_PATH

  • 你正在编译的软件需要链接到本身刚刚编译但尚未安装的库。良好设计的构建系统,例如 AutotoolsCMake,可以帮助处理这个问题。
  • 你正在使用设计为在单个目录之外运行的软件,它没有安装脚本,或安装脚本将库放置在非标准目录中。一些应用具有 Linux 用户可以下载、复制到 /opt 并在“不安装”的情况下运行的版本。LD_PATH_LIBRARY 变量是通过封装脚本设置的,因此用户通常甚至不知道它已被设置。

编译软件为你在运行系统方面提供了很大的灵活性。LD_LIBRARY_PATH 变量以及 -L-l GCC 选项是这种灵活性的组成部分。


via: https://opensource.com/article/22/5/compile-code-ldlibrarypath

作者:Seth Kenlon 选题:lkxed 译者:geekpi 校对:wxy

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

机器学习基本上是人工智能的一个子集,它使用以前存在的数据对新数据进行预测。

当然,现在我们所有人都知道这个道理了!这篇文章展示了如何将 Python 中开发的机器学习模型作为 Java 代码的一部分来进行预测。

Machine-learning

本文假设你熟悉基本的开发技巧并理解机器学习。我们将从训练我们的模型开始,然后在 Python 中制作一个机器学习模型。

我以一个洪水预测模型为例。首先,导入以下库:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

当我们成功地导入了这些库,我们就需要输入数据集,如下面的代码所示。为了预测洪水,我使用的是河流水位数据集。

from google.colab import files
uploaded = files.upload()
for fn in uploaded.keys(): 
    print('User uploaded file "{name}" with length {length} bytes'.format(name=fn, length=len(uploaded[fn])))

如果没有选择文件的话,选择上传的文件。

只有在当前浏览器会话中执行了该单元格时,上传部件才可用。请重新运行此单元,上传文件 Hoppers Crossing-Hourly-River-Level.csv,大小 2207036 字节。

完成后,我们就可以使用 sklearn 库来训练我们的模型。为此,我们首先需要导入该库和算法模型,如图 1 所示。

Figure 1: Training the model

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

完成后,我们就训练好了我们的模型,现在可以进行预测了,如图 2 所示。

Figure 2: Making predictions

在 Java 中使用 ML 模型

我们现在需要做的是把 ML 模型转换成一个可以被 Java 程序使用的模型。有一个叫做 sklearn2pmml 的库可以帮助我们做到这一点:

# Install the library
pip install sklearn2pmml

库安装完毕后,我们就可以转换我们已经训练好的模型,如下图所示:

sklearn2pmml(pipeline, ‘model.pmml’, with_repr = True)

这就完成了!我们现在可以在我们的 Java 代码中使用生成的 model.pmml 文件来进行预测。请试一试吧!

(LCTT 译注:Java 中有第三方库 jpmml/jpmml-evaluator,它能帮助你使用生成的 model.pmml 进行预测。)


via: https://www.opensourceforu.com/2022/05/using-a-machine-learning-model-to-make-predictions/

作者:Jishnu Saurav Mittapalli 选题:lkxed 译者:geekpi 校对:wxy

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

下一代 CarPlay 将成为汽车操作系统

苹果公司表示,下一代 CarPlay 作为一个完整的车辆界面,可以对车辆进行前所未有的控制,并能获得每辆主机车辆产生的数据。CarPlay 将兼容各种长宽比的显示,与所有主机车辆的系统更加整合。除了目前的导航和媒体功能外,还将处理传统的仪表,如速度表、转速表、温度表和燃料或电动车电量显示等。用户将能够调整他们的空调、座椅加热,甚至直接连接到苹果的智能家居技术。苹果公司称,第一批支持新的 CarPlay 的车辆应该在 2023 年底公布,其合作伙伴包括奥迪、福特、本田、林肯、梅赛德斯-奔驰、日产、保时捷等。

消息来源:CNET
老王点评:看起来真是将汽车变成了手机配件了。

欧盟同意采用通用充电器端口

欧盟立法者周二达成协议,要求在欧盟销售的智能手机等便捷式电子设备必须采用通用充电器端口。欧盟预计将在今年晚些时候正式批准该协议,从 2024 年秋季开始执行这一规定。该通用充电标准基于 USB Type-C,这一协议将对苹果产生不利影响。该公司仍然使用自己的雷雳连接器为 iPhone 充电,虽然该公司最近为 iPad 和 MacBook 配备了 USB-C 接口。苹果公司曾表示,“只规定一种类型的连接器的严格监管扼杀了创新,而不是鼓励创新”。

消息来源:CNBC
老王点评:虽然 Type-C 也有很多外形一样,但是协议不同的接口,但是总比各种不同接口的充电线要好。让我们看看苹果是只在欧洲推出 Type-C 充电接口还是会在全球改变。

MacOS 将很快默认阻止未知的 USB-C 配件

苹果公司即将推出的 macOS 13 Ventura 中的一项新的安全功能将自动阻止新的 USB-C 设备与操作系统进行通信,直到该配件能够得到用户的认可。该功能将在默认情况下启用。但这不适用于电源适配器、独立显示器和与 已批准的集线器的连接,而且即使你不批准该附件,该设备仍然可以充电。

消息来源:Techcrunch
老王点评:有一定的作用,不过我觉得仅仅是让用户同意连接,对于恶意 USB 外设的防御还是不够的。

通过一个简单的小游戏比较 13 种编程语言。

 title=

当我开始学习一种新的编程语言时,会把重点放在定义变量、书写声明以及计算表达式,一旦对这些概念有一个大致的了解,通常就能够自己弄清剩下的部分。大多数编程语言都具有相似性,所以如果你掌握了一种编程语言,学习下一种语言的重点就是弄清楚独有的概念以及区分不同。

我喜欢写一些测试程序来帮助练习新的编程语言。其中我经常写的是一个叫做“猜数字”的小游戏,计算机选出 1 到 100 里的任一数字,然后我来猜。程序循环进行,直到猜出正确数字。通过伪代码可以看出,这是个非常简单的程序:

  • 计算机在 1 到 100 之间选出一个随机数字
  • 循环进行直到猜出该随机数字

    • 计算机读取我的猜测
    • 告诉我我的猜测过高还是过低

我们发表了一些文章,用不同的语言写这个程序。这是一个比较不同语言做同样事情的有趣机会。大多数编程语言具有相似性,所以当你在学习下一种新的编程语言时,主要是学习它的独特之处。

C 语言由 Dennis Ritchie 于 1972 年在贝尔实验室创建,是一种早期的通用编程语言。C 语言非常受欢迎,并迅速成为 Unix 系统上的标准编程语言。正是因为它的流行,许多其他编程语言也采用了类似的编程语法。这就是为什么如果你已经知道如何使用 C 语言编程,学习 C++、Rust、Java、Groovy、JavaScript、awk 或 Lua 会更容易。

接下来我们看看这些不同的编程语言是如何实现 “猜数字” 游戏的主要步骤。我将把重点放在基本元素的相似或不同,跳过一些外围代码,如分配临时变量。

计算机在 1 到 100 之间选出一个随机数字

你可以看到这里有许多相似之处。大多数编程语言使用类似 rand() 的函数,你可以设定一个范围来生成随机数。而其他一些语言使用一个特殊的函数来设定范围生成随机数。

C:

// Using the Linux `getrandom` system call
getrandom(&randval, sizeof(int), GRND_NONBLOCK);
number = randval % maxval + 1;

// Using the standard C library
number = rand() % 100 + 1;

C++:

int number = rand() % 100+1;

Rust:

let random = rng.gen_range(1..101);

Java:

private static final int NUMBER = r.nextInt(100) + 1;

Groovy:

int randomNumber = (new Random()).nextInt(100) + 1

JavaScript:

const randomNumber = Math.floor(Math.random() * 100) + 1

awk:

randomNumber = int(rand() * 100) + 1

Lua:

number = math.random(1,100)

循环进行直到我猜出该随机数字

循环通常是用控制流程来实现的,如 whiledo-while。JavaScript 中的实现没有使用循环,而是 “实时 ”更新 HTML 页面,直到用户猜出正确的数字。Awk 虽然支持循环,但是通过循环读取输入信息是没有意义的,因为 Awk 是基于数据管道的,所以它从文件而不是直接从用户读取输入信息。

C:

do {
    …
} while (guess != number);

C++:

do {
    …
} while ( number != guess );

Rust:

for line in std::io::stdin().lock().lines() {
    …
    break;
}

Java:

while ( guess != NUMBER ) {
    …
}

Groovy:

while ( … ) {
    …
    break;
}

Lua:

while ( player.guess ~= number ) do
    …
end

计算机读取我的猜测

不同编程语言对输入的处理方式不同。例如,JavaScript 直接从 HTML 表单中读取数值,而 Awk 则从数据管道中读取数据。

C:

scanf("%d", &guess);

C++:

cin >> guess;

Rust:

let parsed = line.ok().as_deref().map(str::parse::<i64>);
if let Some(Ok(guess)) = parsed {
    …
}

Java:

guess = player.nextInt();

Groovy:

response = reader.readLine()
int guess = response as Integer

JavaScript:

let myGuess = guess.value

Awk:

guess = int($0)

Lua:

player.answer = io.read()
player.guess = tonumber(player.answer)

告诉我猜测过高还是过低

在这些类 C 语言中,通常是通过 if 语句进行比较的。每种编程语言打印输出的方式有一些变化,但打印语句在每个样本中都是可识别的。

C:

if (guess < number) {
    puts("Too low");
}
else if (guess > number) {
    puts("Too high");
}
…
puts("That's right!");

C++:

if ( guess > number) { cout << "Too high.\n" << endl; }
else if ( guess < number ) { cout << "Too low.\n" << endl; }
else {
    cout << "That's right!\n" << endl;
    exit(0);
}

Rust:

_ if guess < random => println!("Too low"),
_ if guess > random => println!("Too high"),
_ => {
    println!("That's right");
    break;
}

Java:

if ( guess > NUMBER ) {
    System.out.println("Too high");
} else if ( guess < NUMBER ) {
    System.out.println("Too low");
} else {
    System.out.println("That's right!");
    System.exit(0);
}

Groovy:

if (guess < randomNumber)
    print 'too low, try again: '
else if (guess > randomNumber)
    print 'too high, try again: '
else {
    println "that's right"
    break
}

JavaScript:

if (myGuess === randomNumber) {
    feedback.textContent = "You got it right!"
} else if (myGuess > randomNumber) {
    feedback.textContent = "Your guess was " + myGuess + ". That's too high. Try Again!"
} else if (myGuess < randomNumber) {
    feedback.textContent = "Your guess was " + myGuess + ". That's too low. Try Again!"
}

Awk:

if (guess < randomNumber) {
    printf "too low, try again:"
} else if (guess > randomNumber) {
    printf "too high, try again:"
} else {
    printf "that's right\n"
    exit
}

Lua:

if ( player.guess > number ) then
    print("Too high")
elseif ( player.guess < number) then
    print("Too low")
else
    print("That's right!")
    os.exit()
end

非类 C 编程语言会怎么样呢?

非类 C 编程语言会有很大的不同,需要学习特定的语法来完成每一步。Racket 源于 Lisp 和 Scheme,所以它使用 Lisp 的前缀符和大量括号。Python 使用空格而不是括号来表示循环之类的块。Elixir 是一种函数式编程语言,有自己的语法。Bash 是基于 Unix 系统中的 Bourne shell,它本身借鉴了 Algol68,并支持额外的速记符,如 && 作为 and 的变体。Fortran 是在使用打孔卡片输入代码的时期创建的,所以它依赖于一些重要列的 80 列布局。

我将通过比较 if 语句,举例表现这些编程语言的不同。if 判断一个值是否小于或大于另一个值,并向用户打印适当信息。

Racket:

(cond [(> number guess) (displayln "Too low") (inquire-user number)]
    [(< number guess) (displayln "Too high") (inquire-user number)]
    [else (displayln "Correct!")]))

Python:

if guess < random:
    print("Too low")
elif guess > random:
    print("Too high")
else:
    print("That's right!")

Elixir:

cond do
    guess < num ->
        IO.puts "Too low!"
        guess_loop(num)
    guess > num ->
        IO.puts "Too high!"
        guess_loop(num)
    true ->
        IO.puts "That's right!"
end

Bash:

[ "0$guess" -lt $number ] && echo "Too low"
[ "0$guess" -gt $number ] && echo "Too high" 

Fortran:

IF (GUESS.LT.NUMBER) THEN
    PRINT *, 'TOO LOW'
ELSE IF (GUESS.GT.NUMBER) THEN
    PRINT *, 'TOO HIGH'
ENDIF 

更多

当你在学习一种新的编程语言时 “猜数字” 游戏是一个很友好的入门程序,通过一种简单的方式练习了几个常见的编程概念。通过不同编程语言实现这个简单游戏,你可以理解一些核心概念和每种语言的细节。

学习如何用 C 和类 C 语言编写 “猜数字” 游戏:

其他语言:


via: https://opensource.com/article/21/4/compare-programming-languages

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

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

Beyond 计划连接起未来科技行业的人才和开源文化。

 title=

那时,我还是一个大学生,我不明白人们为什么那么吹捧开源软件。我也使用 Linux 和开源软件,但是我不明白开源的运作模式,不知道如何参加一个开源项目,也不知道这对我未来的职业有什么好处。我的开发经验主要是家庭作业和学位需要的一个大型期末项目。

所以,当我开始踏足科技行业时,我发现我还有很多知识需要学习。我需要了解如何加入一个既定的、可能很大并且分散在不同地方的团队,为一个正在进行中的项目工作。我还要学会正确的沟通以保证我付出的努力不白费。

在这方面,我并不特别。我只是众多毕业生中的一员。

开源让毕业生的起点更高

作为一个工程师,一个管理者,从那时起我开始帮助刚入行的工程师。我发现,有开源经验的毕业生比没有开源经验的毕业生能更快的入门。

通过将开源方法纳入学术研究,学生们可以获得相关的行业经验,学会利用他们自己的知识,并建立一个陈述观点和分享知识的平台。参与开源项目可以对学生的技术知识和经验产生积极影响。这可以帮助他们更好的规划自己的职业生涯。

开源在科技行业的价值是公认的,它塑造了全球软件公司的文化。参与开源项目并采用 开放组织文化 正在成为行业普遍现象。公司寻求知道如何在开源领域工作并培养其文化的思想新颖、才华横溢的员工。因此,科技行业必须推动学术界将开源文化作为学习科技研究的基本方法之一。

商业之上是开源文化

当我遇到红帽的高级软件工程师 Liora Milbaum 时,我发现,我们对将开源文化和规则引入学术界有着共同的兴趣。Liora 之前创立了 DevOps Loft, 在其中,她与有兴趣进入这个行业的人们分享了 DevOps 实践,并希望发起一个类似的项目,教授大学生开源。我们决定启动 Beyond 计划,将科技行业拥抱开源精神的人才与红帽的实践联系起来。

我们在 Tel Aviv-Yafo 技术学院 开始了 Beyond 计划,在那里,我们受到了信息系统学院的热烈欢迎。我们从介绍 DevOps 技术栈的 “DevOps 入门” 开始。我们开始时最大的挑战是怎么讲明白开源是什么。答案似乎很简单:实践出真理。我们不想给学生们讲授什么老套的学院课程,相反,我们想让学生接触到行业标准。

我们创建了一个包含常见的开源项目和工具的教学大纲来教授 DevOps 技术栈。该课程由工程师教授的讲座和实践组成。学生们被分成小组,每组都由一名工程师指导和支持。他们练习团队合作,分享知识(在团队内外),并有效的协作。

在我们为计算机科学学院的通讯准备的高级课程 “开源开发的基础” 中,我们遇到了另外的困难。当我们的课程开始两周以后,随着新冠疫情在全球的流行,我们完全靠远程沟通。我们通过与学生一起使用我们在红帽日常工作中使用的相同远程协作工具解决了这个问题。我们惊讶于过渡的是如此简单和顺利。

 title=

(Irit Goihman, CC BY-SA 4.0)

成果展示

这两个课程取得了巨大的成功,我们甚至雇佣了我们最优秀的学生之一。我们收到了非常棒的反馈,同学们表示,我们对他们的知识、思维和软技能产生了积极影响。一些学生因为在课程期间的开源贡献而得到了他们第一份技术工作。

其他学术机构对这些课程表达出了极大的兴趣,因此我们将这个项目扩展到了另外一所大学。

很荣幸,在一群优秀工程师的参与下,与 Liora 一起领导这个成功的项目。我们一起助力开源社区的成长。


via: https://opensource.com/article/21/1/open-source-beyond-business

作者:Irit Goihman 选题:lujun9972 译者:duoluoxiaosheng 校对:wxy

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